日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

北风设计模式课程---享元模式

發(fā)布時間:2024/8/26 asp.net 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 北风设计模式课程---享元模式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

北風(fēng)設(shè)計模式課程---享元模式

一、總結(jié)

一句話總結(jié):

不僅要通過視頻學(xué),還要看別的博客里面的介紹,搜講解,搜作用,搜實(shí)例

?

1、享元模式的本質(zhì)是什么?

池技術(shù):各種緩存池都是享元模式的體現(xiàn)

說到享元模式,第一個想到的應(yīng)該就是池技術(shù)了,String常量池、數(shù)據(jù)庫連接池、緩沖池等等都是享元模式的應(yīng)用,所以說享元模式是池技術(shù)的重要實(shí)現(xiàn)方式。

?

2、享元模式 白話原理?

比如我們每次創(chuàng)建字符串對象時,都需要創(chuàng)建一個新的字符串對象的話,內(nèi)存開銷會很大,所以如果第一次創(chuàng)建了字符串對象“adam“,下次再創(chuàng)建相同的字符串”adam“時,只是把它的引用指向”adam“,這樣就實(shí)現(xiàn)了”adam“字符串再內(nèi)存中的共享。

?

3、享元模式實(shí)例?

舉個最簡單的例子,網(wǎng)絡(luò)聯(lián)機(jī)下棋的時候,一臺服務(wù)器連接了多個客戶端(玩家),如果我們每個棋子都要創(chuàng)建對象,那一盤棋可能就有上百個對象產(chǎn)生,玩家多點(diǎn)的話,因?yàn)閮?nèi)存空間有限,一臺服務(wù)器就難以支持了,所以這里要使用享元模式,將棋子對象減少到幾個實(shí)例。下面給出享元模式的定義。

?

4、享元模式的內(nèi)部狀態(tài)和外部狀態(tài) 指什么?

內(nèi)部狀態(tài)指對象共享出來的信息,存儲在享元對象內(nèi)部并且不會隨環(huán)境的改變而改變;
外部狀態(tài)指對象得以依賴的一個標(biāo)記,是隨環(huán)境改變而改變的、不可共享的狀態(tài)。

?

5、享元模式的內(nèi)部狀態(tài)和外部狀態(tài) 實(shí)例?

棋子顏色就是棋子的內(nèi)部狀態(tài)
方位坐標(biāo)就是棋子的外部狀態(tài)

我們舉一個最簡單的例子,棋牌類游戲大家都有玩過吧,比如說說圍棋和跳棋,它們都有大量的棋子對象,圍棋和五子棋只有黑白兩色,跳棋顏色略多一點(diǎn),但也是不太變化的,所以棋子顏色就是棋子的內(nèi)部狀態(tài);而各個棋子之間的差別就是位置的不同,我們落子嘛,落子顏色是定的,但位置是變化的,所以方位坐標(biāo)就是棋子的外部狀態(tài)。

?

6、為什么這里要用享元模式呢?

可以想象一下,上面提到的棋類游戲的例子,比如圍棋,理論上有361個空位可以放棋子,常規(guī)情況下每盤棋都有可能有兩三百個棋子對象產(chǎn)生,因?yàn)閮?nèi)存空間有限,一臺服務(wù)器很難支持更多的玩家玩圍棋游戲,如果用享元模式來處理棋子,那么棋子對象就可以減少到只有兩個實(shí)例,這樣就很好的解決了對象的開銷問題。

?

7、享元模式 池子中的對象如何標(biāo)識?

用唯一標(biāo)識碼判斷:如果在內(nèi)存中有,則返回這個唯一標(biāo)識碼所標(biāo)識的對象,用HashMap/HashTable存儲

?

8、何時使用 享元模式?

1、系統(tǒng)中有大量對象時
2、這些對象消耗大量內(nèi)存時
3、這些對象的狀態(tài)大部分可以外部化時

?

9、享元模式 應(yīng)用實(shí)例?

String常量池
數(shù)據(jù)庫連接池

?

10、享元模式 優(yōu)缺點(diǎn)?

大大減少了對象的創(chuàng)建,降低了程序內(nèi)存的占用,提高效率:優(yōu)點(diǎn)
提高了系統(tǒng)的復(fù)雜度。需要分離出內(nèi)部狀態(tài)和外部狀態(tài),而外部狀態(tài)具有固化特性,不應(yīng)該隨著內(nèi)部狀態(tài)的改變而改變:缺點(diǎn)

?

?

?

二、簡說設(shè)計模式——享元模式

轉(zhuǎn)自或參考:簡說設(shè)計模式——享元模式
https://www.cnblogs.com/adamjwh/p/9070107.html

一、什么是享元模式

  說到享元模式,第一個想到的應(yīng)該就是池技術(shù)了,String常量池、數(shù)據(jù)庫連接池、緩沖池等等都是享元模式的應(yīng)用,所以說享元模式是池技術(shù)的重要實(shí)現(xiàn)方式。

  比如我們每次創(chuàng)建字符串對象時,都需要創(chuàng)建一個新的字符串對象的話,內(nèi)存開銷會很大,所以如果第一次創(chuàng)建了字符串對象“adam“,下次再創(chuàng)建相同的字符串”adam“時,只是把它的引用指向”adam“,這樣就實(shí)現(xiàn)了”adam“字符串再內(nèi)存中的共享。

  舉個最簡單的例子,網(wǎng)絡(luò)聯(lián)機(jī)下棋的時候,一臺服務(wù)器連接了多個客戶端(玩家),如果我們每個棋子都要創(chuàng)建對象,那一盤棋可能就有上百個對象產(chǎn)生,玩家多點(diǎn)的話,因?yàn)閮?nèi)存空間有限,一臺服務(wù)器就難以支持了,所以這里要使用享元模式,將棋子對象減少到幾個實(shí)例。下面給出享元模式的定義。

  享元模式(Flyweight),運(yùn)用共享技術(shù)有效地支持大量細(xì)粒度的對象。UML結(jié)構(gòu)圖如下:

?  其中,Flyweight是抽象享元角色。它是產(chǎn)品的抽象類,同時定義出對象的外部狀態(tài)和內(nèi)部狀態(tài)(外部狀態(tài)及內(nèi)部狀態(tài)相關(guān)內(nèi)容見后方)的接口或?qū)崿F(xiàn);ConcreteFlyweight是具體享元角色,是具體的產(chǎn)品類,實(shí)現(xiàn)抽象角色定義的業(yè)務(wù);UnsharedConcreteFlyweight是不可共享的享元角色,一般不會出現(xiàn)在享元工廠中;FlyweightFactory是享元工廠,它用于構(gòu)造一個池容器,同時提供從池中獲得對象的方法。

  1. Flyweight抽象類

  所有具體享元類的超類或接口,通過這個接口,Flyweight可以接受并作用于外部狀態(tài)。

1 public abstract class Flyweight { 2 3 //內(nèi)部狀態(tài) 4 public String intrinsic; 5 //外部狀態(tài) 6 protected final String extrinsic; 7 8 //要求享元角色必須接受外部狀態(tài) 9 public Flyweight(String extrinsic) { 10 this.extrinsic = extrinsic; 11 } 12 13 //定義業(yè)務(wù)操作 14 public abstract void operate(int extrinsic); 15 16 public String getIntrinsic() { 17 return intrinsic; 18 } 19 20 public void setIntrinsic(String intrinsic) { 21 this.intrinsic = intrinsic; 22 } 23 24 }

  2.?ConcreteFlyweight類

  繼承Flyweight超類或?qū)崿F(xiàn)Flyweight接口,并為其內(nèi)部狀態(tài)增加存儲空間。

1 public class ConcreteFlyweight extends Flyweight { 2 3 //接受外部狀態(tài) 4 public ConcreteFlyweight(String extrinsic) { 5 super(extrinsic); 6 } 7 8 //根據(jù)外部狀態(tài)進(jìn)行邏輯處理 9 @Override 10 public void operate(int extrinsic) { 11 System.out.println("具體Flyweight:" + extrinsic); 12 } 13 14 }

  3. UnsharedConcreteFlyweight類

  指那些不需要共享的Flyweight子類。

1 public class UnsharedConcreteFlyweight extends Flyweight { 2 3 public UnsharedConcreteFlyweight(String extrinsic) { 4 super(extrinsic); 5 } 6 7 @Override 8 public void operate(int extrinsic) { 9 System.out.println("不共享的具體Flyweight:" + extrinsic); 10 } 11 12 }

  4. FlyweightFactory類

  一個享元工廠,用來創(chuàng)建并管理Flyweight對象,主要是用來確保合理地共享Flyweight,當(dāng)用戶請求一個Flyweight時,FlyweightFactory對象提供一個已創(chuàng)建的實(shí)例或創(chuàng)建一個實(shí)例。

1 public class FlyweightFactory { 2 3 //定義一個池容器 4 private static HashMap<String, Flyweight> pool = new HashMap<>(); 5 6 //享元工廠 7 public static Flyweight getFlyweight(String extrinsic) { 8 Flyweight flyweight = null; 9 10 if(pool.containsKey(extrinsic)) { //池中有該對象 11 flyweight = pool.get(extrinsic); 12 System.out.print("已有 " + extrinsic + " 直接從池中取---->"); 13 } else { 14 //根據(jù)外部狀態(tài)創(chuàng)建享元對象 15 flyweight = new ConcreteFlyweight(extrinsic); 16 //放入池中 17 pool.put(extrinsic, flyweight); 18 System.out.print("創(chuàng)建 " + extrinsic + " 并從池中取出---->"); 19 } 20 21 return flyweight; 22 } 23 }

  5. Client客戶端

1 public class Client { 2 3 public static void main(String[] args) { 4 int extrinsic = 22; 5 6 Flyweight flyweightX = FlyweightFactory.getFlyweight("X"); 7 flyweightX.operate(++ extrinsic); 8 9 Flyweight flyweightY = FlyweightFactory.getFlyweight("Y"); 10 flyweightY.operate(++ extrinsic); 11 12 Flyweight flyweightZ = FlyweightFactory.getFlyweight("Z"); 13 flyweightZ.operate(++ extrinsic); 14 15 Flyweight flyweightReX = FlyweightFactory.getFlyweight("X"); 16 flyweightReX.operate(++ extrinsic); 17 18 Flyweight unsharedFlyweight = new UnsharedConcreteFlyweight("X"); 19 unsharedFlyweight.operate(++ extrinsic); 20 } 21 22 }

  運(yùn)行結(jié)果如下:

  

  從這個結(jié)果我們可以看出來,第一次創(chuàng)建X、Y、Z時,都是先創(chuàng)建再從池中取出,而第二次創(chuàng)建X時,因?yàn)槌刂幸呀?jīng)存在了,所以直接從池中取出,這就是享元模式。

二、內(nèi)部狀態(tài)和外部狀態(tài)

  上面享元模式的定義為我們提出了兩個要求:細(xì)粒度和共享對象。我們知道分配太多的對象到應(yīng)用程序中將有損程序的性能,同時還容易造成內(nèi)存溢出,要避免這種情況,用到的就是共享技術(shù),這里就需要提到內(nèi)部狀態(tài)和外部狀態(tài)了。

  因?yàn)橐蠹?xì)粒度對象,所以不可避免地會使對象數(shù)量多且性質(zhì)相近,此時我們就將這些對象的信息分為兩個部分:內(nèi)部狀態(tài)和外部狀態(tài)。

  內(nèi)部狀態(tài)指對象共享出來的信息,存儲在享元對象內(nèi)部并且不會隨環(huán)境的改變而改變;外部狀態(tài)指對象得以依賴的一個標(biāo)記,是隨環(huán)境改變而改變的、不可共享的狀態(tài)。

  我們舉一個最簡單的例子,棋牌類游戲大家都有玩過吧,比如說說圍棋和跳棋,它們都有大量的棋子對象,圍棋和五子棋只有黑白兩色,跳棋顏色略多一點(diǎn),但也是不太變化的,所以棋子顏色就是棋子的內(nèi)部狀態(tài);而各個棋子之間的差別就是位置的不同,我們落子嘛,落子顏色是定的,但位置是變化的,所以方位坐標(biāo)就是棋子的外部狀態(tài)。

  那么為什么這里要用享元模式呢?可以想象一下,上面提到的棋類游戲的例子,比如圍棋,理論上有361個空位可以放棋子,常規(guī)情況下每盤棋都有可能有兩三百個棋子對象產(chǎn)生,因?yàn)閮?nèi)存空間有限,一臺服務(wù)器很難支持更多的玩家玩圍棋游戲,如果用享元模式來處理棋子,那么棋子對象就可以減少到只有兩個實(shí)例,這樣就很好的解決了對象的開銷問題。

三、享元模式的應(yīng)用

  1. 何時使用

  • 系統(tǒng)中有大量對象時
  • 這些對象消耗大量內(nèi)存時
  • 這些對象的狀態(tài)大部分可以外部化時

  2. 方法

  • 用唯一標(biāo)識碼判斷,如果在內(nèi)存中有,則返回這個唯一標(biāo)識碼所標(biāo)識的對象,用HashMap/HashTable存儲

  3. 優(yōu)點(diǎn)

  • 大大減少了對象的創(chuàng)建,降低了程序內(nèi)存的占用,提高效率

  4. 缺點(diǎn)

  • 提高了系統(tǒng)的復(fù)雜度。需要分離出內(nèi)部狀態(tài)和外部狀態(tài),而外部狀態(tài)具有固化特性,不應(yīng)該隨著內(nèi)部狀態(tài)的改變而改變

?  5. 使用場景

  • 系統(tǒng)中存在大量相似對象
  • 需要緩沖池的場景

?  6. 應(yīng)用實(shí)例

  • String常量池
  • 數(shù)據(jù)庫連接池

?  7. 注意事項(xiàng)

  • 注意劃分內(nèi)部狀態(tài)和外部狀態(tài),否則可能會引起線程安全問題
  • 這些類必須有一個工廠類加以控制

?四、享元模式的實(shí)現(xiàn)

  應(yīng)用實(shí)例的話,其實(shí)上面的模板就已經(jīng)是一個很好的例子了,類似于String常量池,沒有的對象創(chuàng)建后存在池中,若池中存在該對象則直接從池中取出。

  為了更好的理解享元模式,這里再舉一個實(shí)例,比如接了我一個小型的外包項(xiàng)目,是做一個產(chǎn)品展示網(wǎng)站,后來他的朋友們也希望做這樣的網(wǎng)站,但要求都有些不同,我們當(dāng)然不能直接復(fù)制粘貼再來一份,有任希望是新聞發(fā)布形式的,有人希望是博客形式的等等,而且因?yàn)榻?jīng)費(fèi)原因不能每個網(wǎng)站租用一個空間。

  其實(shí)這里他們需要的網(wǎng)站結(jié)構(gòu)相似度很高,而且都不是高訪問量網(wǎng)站,如果分成多個虛擬空間來處理,相當(dāng)于一個相同網(wǎng)站的實(shí)例對象很多,這是造成服務(wù)器的大量資源浪費(fèi)。如果整合到一個網(wǎng)站中,共享其相關(guān)的代碼和數(shù)據(jù),那么對于硬盤、內(nèi)存、CPU、數(shù)據(jù)庫空間等服務(wù)器資源都可以達(dá)成共享,減少服務(wù)器資源;而對于代碼,由于是一份實(shí)例,維護(hù)和擴(kuò)展都更加容易。

  那么此時就可以用到享元模式了。UML圖如下:

  1. 網(wǎng)站抽象類

1 public abstract class WebSite { 2 3 public abstract void use(); 4 5 }

  2. 具體網(wǎng)站類

1 public class ConcreteWebSite extends WebSite { 2 3 private String name = ""; 4 5 public ConcreteWebSite(String name) { 6 this.name = name; 7 } 8 9 @Override 10 public void use() { 11 System.out.println("網(wǎng)站分類:" + name); 12 } 13 14 }

?  3. 網(wǎng)絡(luò)工廠類

  這里使用HashMap來作為池,通過put和get方法實(shí)現(xiàn)加入池與從池中取的操作。

1 public class WebSiteFactory { 2 3 private HashMap<String, ConcreteWebSite> pool = new HashMap<>(); 4 5 //獲得網(wǎng)站分類 6 public WebSite getWebSiteCategory(String key) { 7 if(!pool.containsKey(key)) { 8 pool.put(key, new ConcreteWebSite(key)); 9 } 10 11 return (WebSite)pool.get(key); 12 } 13 14 //獲得網(wǎng)站分類總數(shù) 15 public int getWebSiteCount() { 16 return pool.size(); 17 } 18 19 }

?  4. Client客戶端

  這里測試用例給了兩種網(wǎng)站,原先我們需要做三個產(chǎn)品展示和三個博客的網(wǎng)站,也即需要六個網(wǎng)站類的實(shí)例,但其實(shí)它們本質(zhì)上都是一樣的代碼,可以利用用戶ID號的不同,來區(qū)分不同的用戶,具體數(shù)據(jù)和模板可以不同,但代碼核心和數(shù)據(jù)庫卻是共享的。

1 public class Client { 2 3 public static void main(String[] args) { 4 WebSiteFactory factory = new WebSiteFactory(); 5 6 WebSite fx = factory.getWebSiteCategory("產(chǎn)品展示"); 7 fx.use(); 8 9 WebSite fy = factory.getWebSiteCategory("產(chǎn)品展示"); 10 fy.use(); 11 12 WebSite fz = factory.getWebSiteCategory("產(chǎn)品展示"); 13 fz.use(); 14 15 WebSite fa = factory.getWebSiteCategory("博客"); 16 fa.use(); 17 18 WebSite fb = factory.getWebSiteCategory("博客"); 19 fb.use(); 20 21 WebSite fc = factory.getWebSiteCategory("博客"); 22 fc.use(); 23 24 System.out.println("網(wǎng)站分類總數(shù)為:" + factory.getWebSiteCount()); 25 } 26 27 }

?  運(yùn)行結(jié)果如下:

  

  可以看出,雖然我們做了6個網(wǎng)站,但網(wǎng)站分類只有2個。這樣基本算是實(shí)現(xiàn)了享元模式的共享對象的目的,但想想上面提到的內(nèi)部狀態(tài)和外部狀態(tài),這里實(shí)際上沒有體現(xiàn)對象間的不同,只體現(xiàn)了它們的共享部分。

  5. 用戶類

  所以我們再加一個用戶類,作為網(wǎng)站類的外部狀態(tài),并在use()方法中傳遞用戶對象,UML如下:

  下面添加一個User類。

1 public class User { 2 3 private String name; 4 5 public User(String name) { 6 this.name = name; 7 } 8 9 public String getName() { 10 return name; 11 } 12 13 }

  然后再對use()方法進(jìn)行修改,添加參數(shù),以抽象類為例:?public abstract void use(User user);?

  而客戶端中只需對每一個網(wǎng)站添加一個用戶即可,如:?fx.use(new User("adam"));?

  (具體內(nèi)容可參考源碼,源碼地址見最下方)

  運(yùn)行結(jié)果如下:

  

  這樣就可以協(xié)調(diào)內(nèi)部與外部狀態(tài),哪怕接手了上千個網(wǎng)站的需求,只要要求相同或類似,實(shí)際開發(fā)代碼也就是分類的哪幾種。

?

  源碼地址:https://gitee.com/adamjiangwh/GoF

轉(zhuǎn)載于:https://www.cnblogs.com/Renyi-Fan/p/11029069.html

總結(jié)

以上是生活随笔為你收集整理的北风设计模式课程---享元模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 无码av天堂一区二区三区 | 美女的奶胸大爽爽大片 | 熟女高潮一区二区三区 | 久久综合色鬼 | 一级做a爱视频 | 欧洲成人一区二区三区 | 欧美日韩一区二区在线 | 国产日韩视频一区 | 免费日韩毛片 | 黄色片地址| 国产精品毛片va一区二区三区 | 日韩欧美中文字幕一区 | 6996电视影片免费看 | 天堂中文字幕在线 | 少妇一级淫片免费看 | 欧美一级免费视频 | 亚洲日本国产精品 | 中文字幕人妻一区二区三区视频 | 国产精品一区二区三区久久 | 日本香蕉视频 | av免播放器 | 尤物网站在线 | 亚洲视频综合 | 亚洲欧美日本一区二区 | 西西大胆午夜视频 | 欧美日韩一区二区三区四区五区 | 宇都宫紫苑在线播放 | 国产亚洲小视频 | 国产一区二区视频在线观看 | 草草在线视频 | 在线综合色 | 亚洲国产97在线精品一区 | 欧美日韩国产精品一区二区三区 | 中国精品视频 | 176精品免费 | 国产日韩在线播放 | 相亲对象是问题学生动漫免费观看 | 久久av一区二区三 | 久草综合网 | 91爱啪| 欧美成人精品一区二区三区 | 色人阁视频 | 亚洲 欧美 变态 另类 综合 | 国产最新网址 | 干骚视频 | 日韩精选av| 麻豆精品视频在线 | 美女国产一区 | 国产一区欧美 | 日本一二三区视频 | 一区二区日韩欧美 | 日本网站在线免费观看 | 久久久精品久久久久 | 在线观看日本 | 一级特毛片 | 成人h动漫精品一区二区无码 | 成人免费无码大片a毛片 | 中文字幕一区电影 | 波多野结衣国产在线 | 三级特黄视频 | 99精品欧美一区二区三区 | 日韩在线网 | 久久精品视频在线 | 亚洲三级网 | 日韩色av| 色无极亚洲影院 | 狠狠综合久久av一区二区 | 欧美成年人视频在线观看 | 久久影院午夜理论片无码 | 青青草视频在线观看免费 | 欧美综合图区 | 国产精品一区在线观看 | 欧美整片sss | 小泽玛利亚一区二区三区视频 | 成人网在线看 | 日韩一级黄色片 | a毛片视频| 中文字幕在线一 | 久久久久久1 | 污在线观看 | 超碰66 | 久久这里只有精品99 | 中文在线一区二区 | 日本免费高清一区二区 | 亚洲天堂中文字幕在线观看 | 国语对白一区二区 | 欧美精品乱人伦久久久久久 | 国产嘿咻 | 91性高潮久久久久久久久 | 99欧美 | 成人欧美日韩 | 国产免费无码一区二区 | 亚洲国产久| 91黑人精品一区二区三区 | 一区二区三区在线免费观看视频 | 日韩午夜 | 精品一区二区三区四区视频 | 亚洲精品乱码久久久久久蜜桃欧美 | av高清不卡 |