第二十二章 Caché 設計模式 享元模式
定義
運用共享技術有效地支持大量細粒度的對象。
優點
享元模式可以避免大量非常相似類的開銷,在程序設計中,有時需要生成大量細粒度的類實例來表示數據。如果能發現這些實例除了幾個參數外基本上相同的,有時就能夠大幅度地減少需要實例化的類的數量。如果把這些參數移到類實例外面,在方法調用時傳遞他們進來,就可以通過共享大幅度減少單個實例的數目。
使用場景
- 系統中存在大量的相似對象。
- 需要緩衝池場景。
- 如果一個應用程序使用了大量的對象,而大量的這些對象造成了很大的儲存開銷時就應該考慮使用。
結構圖
描述
做六個網站,三個產品展示,三個博客網站。
完整示例
實體類
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,利用享元模式如何實現。