享元模式

來自書籍-------------設計模式之禪java

享元模式:是池技術的重要實現,使用共享對象可有效支持大量的細粒度的對象。  定義兩個要求  細粒度的對象和共享對象。 設計模式

  要求細粒度的對象就必然會存在大量且性質類似的對象,咱們將對象的信息分爲兩個部分  內部狀態 和外部狀態this

   內部狀態 是對象可共享的信息,存儲在享元對象內部而且不會隨環境改變而改變.spa

   外部狀態 是對象得以依賴的一個標記,是隨環境而改變的,不能夠共享的狀態線程

 

下面以書中例子爲依據設計

 

SignInfo 對象主要由4中location 和 30中subject組成 ,因此能夠構建一個池來存儲這120個對象,從而實現對象共享3d

 

SignInfo.javacode

package com.designModel.sharedModel;

/**
 * 報考信息
 */
public class SignInfo {

    private String location;

    private String subject;

    public String getLocation() {
        return location;
    }

    public void setLocation(String location) {
        this.location = location;
    }

    public String getSubject() {
        return subject;
    }

    public void setSubject(String subject) {
        this.subject = subject;
    }

}

 

 

SignInfo4Pool.java對象

package com.designModel.sharedModel;

public class SignInfo4Pool extends SignInfo {

    //定義一個對象池提取的key值
    private String key;


    public SignInfo4Pool(String key) {
        this.key = key;
    }


    public String getKey() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }


}

 

 

SignInfoFactory.javablog

package com.designModel.sharedModel;

import java.util.HashMap;

public class SignInfoFactory {

    //容器池  String類型 表示外部狀態(最好以java基本類型爲標誌)
    private static HashMap<String, SignInfo> pool = new HashMap<>();


    public static SignInfo getSignInfo(String key) {

        SignInfo result = null;
        if (!pool.containsKey(key)) {
            result = new SignInfo4Pool(key);
            pool.put(key, result);
            System.out.println("創建對象,並放置到線程池中");

        }else{
            result = pool.get(key);
            System.out.println("從線程池中取出對象");
        }
        return result;
    }

}

 

 

Client.java調用代碼

package com.designModel.sharedModel;

public class Client {

    public static void main(String... args) {

        for (int i=0;i<4;i++) {
            String subject = "科目" + i;
            for (int j=0;j<30;j++) {
                String key = subject + "考試地點" + j;
                SignInfoFactory.getSignInfo(key);
            }
        }

        SignInfoFactory.getSignInfo("科目1考試地點2");

    }
}

 

 

享元模式的通用類圖

 

 

 Flyweight---------------抽象享元角色

它簡單地說是就是一個產品的抽象類,同時定義出對象的外部狀態和內部狀態的接口或實現。

 

ConcreteFlyweight---------------具體享元角色

具體的一個產品類,實現抽象角色定義的業務,該角色須要注意的是內部狀態處理應該與環境無關。

 

unsharedConcreteFlyweight -----------------不可共享的享元角色

具體做用不太清楚??????

 

FlyweightFactory ---------享元工廠

職責就是構造一個池容器,同時提供從池中獲取對象的方法。

 

 

我的總結  其實享元模式 就是共享對象,避免建立多個相同的對象,這相似與java中String 字符串    String str1="abc"  String str2="abc"   str1==str2  爲true , 其實 str1和 str2都指向同一個字符串"abc",而"abc"放置在字符串常量池中,這就是共享模式的應用。

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息