美國黑人女子收藏海量遊戲主機 打破兩項吉尼斯紀錄
-
案例
-
一個小型的外包專案,給客戶A做一個產品展示網站,客戶A的朋友感覺效果不錯,也希望做這樣的產品展示網站,但是要求有些不同:
-
有客戶要求以新聞的方式釋出
-
有客戶要求以部落格的方式釋出
-
有客戶希望以微信公眾號地方形式釋出
-
-
-
享元模式
-
基本介紹
-
享元模式也叫作蠅量模式:應用共享技術有效的支援大量細粒度的物件
-
常用於系統底層開發,解決系統的效能問題。例如資料庫連線池,裡面都是建立好的連線物件,在這些連線物件中有我們需要的則直接拿來用,避免重新建立,如果沒有,則建立一個
-
享元模式能夠解決重複物件的記憶體浪費問題,當系統中有大量相似的物件,需要緩衝池時。不需要總是建立新物件,可以從緩衝池裡面拿,這樣可以降低系統記憶體,同時提高效率
-
享元模式的經典應用就是池技術,例如:String常量池、資料庫連線池、緩衝池等都是享元模式的應用,享元模式是池技術的重要實現方式
-
-
類圖及分析
-
類圖、
-
分析
-
FlyWeight是抽象的享元角色,他是產品的抽象類,同時定會出了物件的外部狀態和內部狀態的介面或者實現
-
ConcreteFlyWeight是具體的享元角色,是具體的產品類,實現抽象角色定義相關業務
-
UnsharedCincreteFlyweigh是不可共享的角色,一般不會出現在享元工廠
-
FlyWeightFactory享元工廠類,用於構建一個池容器(集合),同時提供從池中獲取物件的方法
-
-
內部狀態和外部狀態
-
享元模式提出了兩個要求:細粒度和共享獨享,這裡就涉及到了內部狀態和外部狀態了,即將物件的資訊分為兩個部分:內部狀態和外部狀態
-
內部狀態是指:物件共享出來的資訊,儲存在享元物件內部並且不會隨環境的變化而變化
-
外部狀態是指:物件得以依賴的一個標記,是隨環境改變而改變的、不可共享的狀態
-
例子:圍棋理論上有361個位置可以放棋子,每個棋盤都有可能有兩三百個棋子物件產生,因為記憶體空間有限,一臺伺服器很難支援更多的玩家玩圍棋遊戲,如果使用享元模式來處理棋子,那麼棋子物件就可以減少到兩個例項,這樣就可以很好的解決了物件的開銷問題
-
-
-
享元模式解決網站展現的專案方案
-
類圖
-
程式碼
//享元模式的外部狀態(哪個使用者在用)
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());
}
}
-
-
享元模式在JDK原始碼中的使用
-
Integer中的享元模式
-
測試程式碼
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);
-
-
享元模式注意事項及細節
-
在享元模式中可這樣理解,享:共享,元:表示物件
-
系統中有大量的物件,這些物件消耗大量的記憶體,並且物件的狀態大部分可以外部化時·,就可以考慮使用享元模式
-
用唯一標識碼判斷,如果在記憶體中有,則返回這個標識碼所標識的物件,用HashMap或者HashTable儲存
-
享元模式大大減少了物件的建立,降低了記憶體物件的佔用,提高效率
-
享元模式提高了系統的複雜度。需要分離出內部狀態和外部狀態,而內部狀態具有固化特性,不應該隨著內部狀態的改變而改變
-
使用享元模式時,注意劃分內部狀態和外部狀態,並且需要一個工廠類加以控制
-
-
-
-