欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java設計模式之享元模式示例詳解

 更新時間:2022年03月03日 14:57:35   作者:溫故知新之java  
享元模式(FlyWeight?Pattern),也叫蠅量模式,運用共享技術,有效的支持大量細粒度的對象,享元模式就是池技術的重要實現(xiàn)方式。本文將通過示例詳細講解享元模式,感興趣的可以了解一下

定義

享元模式(FlyWeight Pattern),也叫蠅量模式,運用共享技術,有效的支持大量細粒度的對象,享元模式就是池技術的重要實現(xiàn)方式。

原理類圖

  • Flyweight :抽象的享元角色,他是抽象的產(chǎn)品類,同時他會定義出對象的內(nèi)部狀態(tài)和外部狀態(tài)
  • ConcreteFlyweight :是具體的享元角色,具體的產(chǎn)品類,實現(xiàn)抽象角色,實現(xiàn)具體的業(yè)務邏輯
  • UnsharedConcreteFlyweight :不可共享的角色,這個角色也可能出現(xiàn)在享元模式中
  • FlyweightFactory :享元工廠類,用于構建一個池的容器,同時在享元工廠里會提供公共方法 (從池子里獲取對象,獲取池子里的對象總數(shù),根據(jù)key獲取對象,,)
  • Client:客戶端了,使用享元模式去完成業(yè)務邏輯

案例

需求

我們接了一個小型的外包項目,給客戶老王做一個產(chǎn)品展示網(wǎng)頁,老王的朋友們感覺效果不錯,也希望做這樣的產(chǎn)品展示網(wǎng)頁,但是他們要求都有些不同

1)有客戶要求網(wǎng)頁以新聞的形式發(fā)布

2)有客戶要求網(wǎng)頁以博客的形式發(fā)布

3)有客戶希望網(wǎng)頁以微信公眾號的形式發(fā)布

方案:享元模式

定義網(wǎng)站用戶類

public class User {
    private String name;

    public User(String name){
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

定義網(wǎng)站抽象類——享元角色

public abstract class Website {
    public abstract void show(User user);
}

定義具體的網(wǎng)站類——具體的享元角色

public class ConcreteWebsite extends Website{
    // 網(wǎng)站的發(fā)布形式
    private String type;

    public ConcreteWebsite(String type){
        this.type = type;
    }

    @Override
    public void show(User user) {
        System.out.println("以" + type + "形式發(fā)布網(wǎng)站");
        System.out.println("網(wǎng)站的用戶名是:" + user.getName());
    }
}

定義網(wǎng)站工廠類——享元工廠類

public class WebsiteFactory {
    // 創(chuàng)建HashMap,充當池的角色
    private HashMap<String, ConcreteWebsite> pool = new HashMap<String, ConcreteWebsite>();

    // 根據(jù)類型判斷,獲取池子里的對象
    public Website getWebsite(String type){
        if(!pool.containsKey(type)){
            pool.put(type,new ConcreteWebsite(type));
        }
        return pool.get(type);
    }

    // 獲取池子里的對象總數(shù)
    public int getWebsiteCount(){
        System.out.println("當前池子里的對象總數(shù):" + pool.size());
        return pool.size();
    }
}

定義客戶端測試類

public class Client {
    public static void main(String[] args) {
        //創(chuàng)建一個享元工廠
        WebsiteFactory websiteFactory = new WebsiteFactory();
        Website news = websiteFactory.getWebsite("新聞");
        news.show(new User("老李"));
        Website wechat = websiteFactory.getWebsite("博客");
        wechat.show(new User("老高"));
        websiteFactory.getWebsiteCount();
        Website wechat1 = websiteFactory.getWebsite("微信");
        wechat.show(new User("老沈"));
        websiteFactory.getWebsiteCount();
    }
}

查看測試結果

分析

通過一個工廠類來根據(jù)不同類型的需求,從而生成對應的具體的享元對象,實現(xiàn)了需求。其中享元對象的信息分為兩個部分,內(nèi)部狀態(tài)和外部狀態(tài)。內(nèi)部對象是指對象共享出來的信息,存儲在享元對象內(nèi)部,不隨著環(huán)境的改變而改變,外部對象隨著環(huán)境的改變而改變,不可共享的狀態(tài)。

總結

優(yōu)勢

節(jié)省內(nèi)存空間,重復對象需要被頻繁創(chuàng)建的時候,享元模式由于只會被創(chuàng)建一次,所以對系統(tǒng)的內(nèi)存空間的需求大大減小

提高使用效率,對于可重復的對象只創(chuàng)建一次,再次訪問時直接從池子里拿,相應速度更快,效率也會更高局限性享元模式會提高

劣勢

享元模式會提高系統(tǒng)的復雜度,享元模式需要有一個工廠類加以控制,如果盲目使用,會提高系統(tǒng)邏輯的復雜度

使用場景

享元模式最經(jīng)典的使用場景就是我們各類池技術了

系統(tǒng)中有大量對象的時候,這些對象消耗大量內(nèi)存,可以考慮使用享元模式

到此這篇關于Java設計模式之享元模式示例詳解的文章就介紹到這了,更多相關Java享元模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java 實現(xiàn)repalceAll只替換第二個匹配到的字符串

    Java 實現(xiàn)repalceAll只替換第二個匹配到的字符串

    這篇文章主要介紹了Java 實現(xiàn)repalceAll只替換第二個匹配到的字符串,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Java實現(xiàn)的決策樹算法完整實例

    Java實現(xiàn)的決策樹算法完整實例

    這篇文章主要介紹了Java實現(xiàn)的決策樹算法,簡單描述了決策樹的概念、原理,并結合完整實例形式分析了java實現(xiàn)決策樹算法的相關操作技巧,代碼中備有較為詳盡的注釋便于理解,需要的朋友可以參考下
    2017-11-11
  • 淺談將子類對象賦值給父類對象

    淺談將子類對象賦值給父類對象

    淺談將子類對象賦值給父類對象...
    2006-12-12
  • 深入Java Final

    深入Java Final

    本篇文章,小編將為大家介紹Java Final,有需要的朋友可以參考一下
    2013-04-04
  • Java lambda表達式實現(xiàn)Flink WordCount過程解析

    Java lambda表達式實現(xiàn)Flink WordCount過程解析

    這篇文章主要介紹了Java lambda表達式實現(xiàn)Flink WordCount過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • log4j的Appenders配置方法

    log4j的Appenders配置方法

    下面小編就為大家?guī)硪黄猯og4j的Appenders配置方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • mybatis自動填充時間字段示例代碼

    mybatis自動填充時間字段示例代碼

    這篇文章主要給大家介紹了關于mybatis自動填充時間字段的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-01-01
  • Mybatis中TypeAliasRegistry的作用及使用方法

    Mybatis中TypeAliasRegistry的作用及使用方法

    Mybatis中的TypeAliasRegistry是一個類型別名注冊表,它的作用是為Java類型建立別名,使得在Mybatis配置文件中可以使用別名來代替完整的Java類型名。使用TypeAliasRegistry可以簡化Mybatis配置文件的編寫,提高配置文件的可讀性和可維護性
    2023-05-05
  • 關于SpringBoot的熱部署方案

    關于SpringBoot的熱部署方案

    這篇文章主要介紹了關于SpringBoot的熱部署方案,每次修改代碼就得將項目重啟,重新部署,對于一些大型應用來說,重啟時間需要花費大量的時間成本,本文就來詳解熱部署方案,需要的朋友可以參考下
    2023-05-05
  • JNI實現(xiàn)最簡單的JAVA調用C/C++代碼

    JNI實現(xiàn)最簡單的JAVA調用C/C++代碼

    這篇文章主要介紹了JNI實現(xiàn)最簡單的JAVA調用C/C++代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08

最新評論