首頁 > 軟體

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

2022-03-03 16:01:15

定義

享元模式(FlyWeight Pattern),也叫蠅量模式,運用共用技術,有效的支援大量細粒度的物件,享元模式就是池技術的重要實現方式。

原理類圖

  • Flyweight :抽象的享元角色,他是抽象的產品類,同時他會定義出物件的內部狀態和外部狀態
  • ConcreteFlyweight :是具體的享元角色,具體的產品類,實現抽象角色,實現具體的業務邏輯
  • UnsharedConcreteFlyweight :不可共用的角色,這個角色也可能出現在享元模式中
  • FlyweightFactory :享元工廠類,用於構建一個池的容器,同時在享元工廠裡會提供公共方法 (從池子裡獲取物件,獲取池子裡的物件總數,根據key獲取物件,,)
  • Client:使用者端了,使用享元模式去完成業務邏輯

案例

需求

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

1)有客戶要求網頁以新聞的形式釋出

2)有客戶要求網頁以部落格的形式釋出

3)有客戶希望網頁以微信公眾號的形式釋出

方案:享元模式

定義網站使用者類

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;
    }
}

定義網站抽象類——享元角色

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

定義具體的網站類——具體的享元角色

public class ConcreteWebsite extends Website{
    // 網站的釋出形式
    private String type;

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

    @Override
    public void show(User user) {
        System.out.println("以" + type + "形式釋出網站");
        System.out.println("網站的使用者名稱是:" + user.getName());
    }
}

定義網站工廠類——享元工廠類

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

    // 根據型別判斷,獲取池子裡的物件
    public Website getWebsite(String type){
        if(!pool.containsKey(type)){
            pool.put(type,new ConcreteWebsite(type));
        }
        return pool.get(type);
    }

    // 獲取池子裡的物件總數
    public int getWebsiteCount(){
        System.out.println("當前池子裡的物件總數:" + pool.size());
        return pool.size();
    }
}

定義使用者端測試類

public class Client {
    public static void main(String[] args) {
        //建立一個享元工廠
        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();
    }
}

檢視測試結果

分析

通過一個工廠類來根據不同型別的需求,從而生成對應的具體的享元物件,實現了需求。其中享元物件的資訊分為兩個部分,內部狀態和外部狀態。內部物件是指物件共用出來的資訊,儲存在享元物件內部,不隨著環境的改變而改變,外部物件隨著環境的改變而改變,不可共用的狀態。

總結

優勢

節省記憶體空間,重複物件需要被頻繁建立的時候,享元模式由於只會被建立一次,所以對系統的記憶體空間的需求大大減小

提高使用效率,對於可重複的物件只建立一次,再次存取時直接從池子裡拿,相應速度更快,效率也會更高侷限性享元模式會提高

劣勢

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

使用場景

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

系統中有大量物件的時候,這些物件消耗大量記憶體,可以考慮使用享元模式

到此這篇關於Java設計模式之享元模式範例詳解的文章就介紹到這了,更多相關Java享元模式內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com