第二十二章 Caché 設計模式 享元模式

第二十二章 Caché 設計模式 享元模式

定義

運用共享技術有效地支持大量細粒度的對象。

優點

享元模式可以避免大量非常相似類的開銷,在程序設計中,有時需要生成大量細粒度的類實例來表示數據。如果能發現這些實例除了幾個參數外基本上相同的,有時就能夠大幅度地減少需要實例化的類的數量。如果把這些參數移到類實例外面,在方法調用時傳遞他們進來,就可以通過共享大幅度減少單個實例的數目。

使用場景

  • 系統中存在大量的相似對象。
  • 需要緩衝池場景。
  • 如果一個應用程序使用了大量的對象,而大量的這些對象造成了很大的儲存開銷時就應該考慮使用。

結構圖

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-jGDZRzGh-1588294543860)(66410E0C07C64F489B65DD2390C1A00D)]

描述

做六個網站,三個產品展示,三個博客網站。

完整示例

實體類

Class PHA.YX.Design.Flyweight.User Extends %RegisteredObject
{

Property name As %String;

Method nameGet() As %String [ ServerOnly = 1 ]
{
	Quit i%name
}

Method nameSet(Arg As %String) As %Status [ ServerOnly = 1 ]
{
	s i%name = Arg
	Quit $$$OK
}

Method %OnNew(name As %String) As %Status [ Private, ServerOnly = 1 ]
{
	s ..name = name
	Quit $$$OK
}

}

抽象享元角色

Class PHA.YX.Design.Flyweight.WebSite Extends %RegisteredObject
{

Method Use(user As User) [ Abstract ]
{
}

}

實現享元角色

Class PHA.YX.Design.Flyweight.ConcreteWebSite Extends WebSite
{

Property name As %String;

Method %OnNew(name As %String) As %Status [ Private, ServerOnly = 1 ]
{
	s ..name = name
	Quit $$$OK
}

Method Use(user As User)
{
	w "網站分類" _ ..name _ "用戶," _ user.nameGet(),!
}

}

享元工廠

Class PHA.YX.Design.Flyweight.WebSiteFactory Extends %RegisteredObject
{

Property flyweights As %ArrayOfDataTypes;

Method GetWebSiteCategory(key As %String) As WebSite
{
	i '$d(..flyweights.Data(key)) d
	.d ..flyweights.SetAt(##class(ConcreteWebSite).%New(key),key)
	q ..flyweights.GetAt(key)
}

Method GetWebSiteCount() As %Integer
{
	q ..flyweights.Count()
}

}

調用

/// d ##class(PHA.YX.Design.Program).Flyweight() 
ClassMethod Flyweight()
{
	s factory = ##class(PHA.YX.Design.Flyweight.WebSiteFactory).%New()
	#dim fx as PHA.YX.Design.Flyweight.ConcreteWebSite
	s fx = factory.GetWebSiteCategory("產品展示")
	d fx.Use(##class(PHA.YX.Design.Flyweight.User).%New("姚鑫"))
	
	s fy = factory.GetWebSiteCategory("產品展示")
	d fy.Use(##class(PHA.YX.Design.Flyweight.User).%New("小馬哥"))
	
	s fz = factory.GetWebSiteCategory("產品展示")
	d fz.Use(##class(PHA.YX.Design.Flyweight.User).%New("寶哥"))
	
	s fl = factory.GetWebSiteCategory("博客")
	d fl.Use(##class(PHA.YX.Design.Flyweight.User).%New("楊過"))
	
	s fm = factory.GetWebSiteCategory("博客")
	d fm.Use(##class(PHA.YX.Design.Flyweight.User).%New("小龍女"))
	
	s fn = factory.GetWebSiteCategory("博客")
	d fn.Use(##class(PHA.YX.Design.Flyweight.User).%New("殷素素"))
	
	w "得到網站分類總數爲" _ factory.GetWebSiteCount(),!
}
DHC-APP>d ##class(PHA.YX.Design.Program).Flyweight()
網站分類產品展示用戶,姚鑫
網站分類產品展示用戶,小馬哥
網站分類產品展示用戶,寶哥
網站分類博客用戶,楊過
網站分類博客用戶,小龍女
網站分類博客用戶,殷素素
得到網站分類總數爲2

思考

淘寶商品 iphone7,iphone8 32G 64G 128G,利用享元模式如何實現。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章