大話設計模式筆記(二十三)の享元模式

享元模式

定義

運用共享技術有效的支持大量細粒度的對象。ide

UML圖

舉個栗子

實際開發當中,一個項目若是作得好,若是市場打通到其餘地方,那麼核心代碼實際上是能夠通用的,只不過用着不一樣的數據和特性出來的模版而已,這些對用戶來講是非透明的。使用最小的開銷得到最大的收益,這是全部公司的目的。網站

Talk is cheap, show me the code

(屁話少說,放碼過來)

/**
 * 網站抽象類
 * Created by callmeDevil on 2019/12/15.
 */
public abstract class WebSite {
    public abstract void use(User user);
}
/**
 * 具體網站類
 * Created by callmeDevil on 2019/12/15.
 */
public class ConcreteWebSite extends WebSite{

    private String name = "";

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

    @Override
    public void use(User user) {
        System.out.println("網站分類:" + name + " 用戶:" + user.getName());
    }

}
/**
 * 網站工廠
 * Created by callmeDevil on 2019/12/15.
 */
public class WebSiteFactory {

    private HashMap<String, WebSite> flyweights = new HashMap<>();

    // 得到網站分類
    public WebSite getWebSiteCategory(String key){
        // 判斷是否存在這個對象,若是存在則直接返回,若不存在則實例化再返回
        if (!flyweights.containsKey(key)) {
            flyweights.put(key, new ConcreteWebSite(key));
        }
        return flyweights.get(key);
    }

    // 得到網站分類總數
    public int getWebSiteCount(){
        return flyweights.size();
    }

}
/**
 * 用戶
 * Created by callmeDevil on 2019/12/15.
 */
public class User {

    private String name;

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

    // 省略 get set
}
public class Test {
    public static void main(String[] args) {
        WebSiteFactory factory = new WebSiteFactory();

        WebSite fx = factory.getWebSiteCategory("產品展現");
        fx.use(new User("路飛"));

        // 共享上方生成的對象,再也不實例化
        WebSite fy = factory.getWebSiteCategory("產品展現");
        fy.use(new User("索隆"));

        WebSite fz = factory.getWebSiteCategory("產品展現");
        fz.use(new User("山治"));

        WebSite fl = factory.getWebSiteCategory("博客");
        fl.use(new User("娜美"));

        WebSite fm = factory.getWebSiteCategory("博客");
        fm.use(new User("烏索普"));

        WebSite fn = factory.getWebSiteCategory("博客");
        fn.use(new User("喬巴"));

        // 統計實例化個數,結果應爲2
        System.out.println("網站分類總數爲:" + factory.getWebSiteCount());
    }
}

運行結果this

網站分類:產品展現 用戶:路飛
網站分類:產品展現 用戶:索隆
網站分類:產品展現 用戶:山治
網站分類:博客 用戶:娜美
網站分類:博客 用戶:烏索普
網站分類:博客 用戶:喬巴
網站分類總數爲:2

總結

好處

享元模式能夠避免大量很是類似的類的開銷。在程序設計中,有時須要生成大量細粒度的類實例來表示數據。若是能發現這些實例除了幾個參數外基本相同的,有時就可以受大幅度的減小須要實例化的類的數量。若是能把那些參數移到類實例的外面,在方法調用時將它們傳進來,就能夠經過共享大幅度的減小單個實例的數目。設計

使用情景

  • 若是一個應用程序使用了大量的對象,而大量的這些對象形成了很大存儲開銷時就應該考慮應用
  • 對象的大多數狀態能夠外部狀態,若是刪除對象的外部狀態,那麼能夠用相對較少的共享對象取代不少組對象,此時能夠考慮應用。
相關文章
相關標籤/搜索