來自書籍-------------設計模式之禪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"放置在字符串常量池中,這就是共享模式的應用。