1. 程式人生 > 遊戲 >美國黑人女子收藏海量遊戲主機 打破兩項吉尼斯紀錄

美國黑人女子收藏海量遊戲主機 打破兩項吉尼斯紀錄

設計模式之享元模式
  1. 案例

    1. 一個小型的外包專案,給客戶A做一個產品展示網站,客戶A的朋友感覺效果不錯,也希望做這樣的產品展示網站,但是要求有些不同:

      1. 有客戶要求以新聞的方式釋出

      2. 有客戶要求以部落格的方式釋出

      3. 有客戶希望以微信公眾號地方形式釋出

  2. 享元模式

    1. 基本介紹

      1. 享元模式也叫作蠅量模式:應用共享技術有效的支援大量細粒度的物件

      2. 常用於系統底層開發,解決系統的效能問題。例如資料庫連線池,裡面都是建立好的連線物件,在這些連線物件中有我們需要的則直接拿來用,避免重新建立,如果沒有,則建立一個

      3. 享元模式能夠解決重複物件的記憶體浪費問題,當系統中有大量相似的物件,需要緩衝池時。不需要總是建立新物件,可以從緩衝池裡面拿,這樣可以降低系統記憶體,同時提高效率

      4. 享元模式的經典應用就是池技術,例如:String常量池、資料庫連線池、緩衝池等都是享元模式的應用,享元模式是池技術的重要實現方式

    2. 類圖及分析

      1. 類圖、

      2. 分析

        1. FlyWeight是抽象的享元角色,他是產品的抽象類,同時定會出了物件的外部狀態和內部狀態的介面或者實現

        2. ConcreteFlyWeight是具體的享元角色,是具體的產品類,實現抽象角色定義相關業務

        3. UnsharedCincreteFlyweigh是不可共享的角色,一般不會出現在享元工廠

        4. FlyWeightFactory享元工廠類,用於構建一個池容器(集合),同時提供從池中獲取物件的方法

      3. 內部狀態和外部狀態

        1. 享元模式提出了兩個要求:細粒度和共享獨享,這裡就涉及到了內部狀態和外部狀態了,即將物件的資訊分為兩個部分:內部狀態和外部狀態

        2. 內部狀態是指:物件共享出來的資訊,儲存在享元物件內部並且不會隨環境的變化而變化

        3. 外部狀態是指:物件得以依賴的一個標記,是隨環境改變而改變的、不可共享的狀態

        4. 例子:圍棋理論上有361個位置可以放棋子,每個棋盤都有可能有兩三百個棋子物件產生,因為記憶體空間有限,一臺伺服器很難支援更多的玩家玩圍棋遊戲,如果使用享元模式來處理棋子,那麼棋子物件就可以減少到兩個例項,這樣就可以很好的解決了物件的開銷問題

    3. 享元模式解決網站展現的專案方案

      1. 類圖

      2. 程式碼

        //享元模式的外部狀態(哪個使用者在用)
        public class User{
        private String name;
        //構造方法
        //get和set方法
        }
        public abstract class WebSite{
        public static void use(User user);
        }

        public class ConcreteWebSite extends WebSite{
        //網站通過什麼樣的形式展現,共享的部分
        private String type="";

        //構造器
        public ConcreteWebSite(String type){
        this.type = type;
        }
        public void use(User user){
        System.out.println("網站的釋出形式為:"+type+" "+user.getName()+"在使用。。。。");
        }
        }

        //網站工廠類,返回具體網站
        public class WebSiteFactory{
        private HashMap<String,ConcreteWebSite> pool =new HashMap();
        //根據網站釋出形式。返回一個網站,如果沒有就建立一個網站,放入到池中並返回
        public WebSite getWebSiteCategory(String type){
        if(!pool.containskey(type)){
        pool.put(type,new ConcreteWebSite());
        }
        return (WebSite)pool.get(type);
        }

        //獲取網站分類的總數
        public int getWebSitecount(){
        return pool.size();
        }
        }

        public class Client{
        public static void main(String[] args){
        WebSiteFactory webSiteFactory = new WebSiteFactory();

        //客戶要求通過新聞釋出
        WebSite webSite1=webSiteFactory.getWebSiteCategory("新聞");
        webSite1.use(new User("小特"));

        //檢視網站的分類
        System.out.println("網站的分類總共有:"+webSiteFactory.getWebSitecount());

        }
        }
    4. 享元模式在JDK原始碼中的使用

      1. Integer中的享元模式

      2. 測試程式碼

        Integer x = Integer.valueOf(127);
        Integer y = new Integer(127);
        Integer z = Integer.valueOf(127);
        Integer w = new Integer(127);
        System.out.println(x.equals(y));
        System.out.println(x == y);
        System.out.println(x == z);
        System.out.println(x == =w);
        System.out.println(w == y);

    5. 享元模式注意事項及細節

      1. 在享元模式中可這樣理解,享:共享,元:表示物件

      2. 系統中有大量的物件,這些物件消耗大量的記憶體,並且物件的狀態大部分可以外部化時·,就可以考慮使用享元模式

      3. 用唯一標識碼判斷,如果在記憶體中有,則返回這個標識碼所標識的物件,用HashMap或者HashTable儲存

      4. 享元模式大大減少了物件的建立,降低了記憶體物件的佔用,提高效率

      5. 享元模式提高了系統的複雜度。需要分離出內部狀態和外部狀態,而內部狀態具有固化特性,不應該隨著內部狀態的改變而改變

      6. 使用享元模式時,注意劃分內部狀態和外部狀態,並且需要一個工廠類加以控制

      7. 享元模式的經典應用場景是需要緩衝池的場景,比如String 常量池,資料庫連線池