享元模式:運(yùn)用一個(gè)共享來避免大量擁有相同內(nèi)容對(duì)象的開銷.這種開銷中最常見、直觀的就是內(nèi)存的損耗.享元模式以共享的方式高效的支持大量的細(xì)粒度對(duì)象.
享元模式所涉及到的角色:
抽象享元(Flyweight)角色 :提供抽象接口,以規(guī)定出所有具體享元角色需要實(shí)現(xiàn)的方法.
具體享元(ConcreteFlyweight)角色:實(shí)現(xiàn)抽象享元角色所規(guī)定出的接口.如果有內(nèi)蘊(yùn)狀態(tài)的話,必須負(fù)責(zé)為內(nèi)蘊(yùn)狀態(tài)提供存儲(chǔ)空間.
享元工廠(FlyweightFactory)角色 :本角色負(fù)責(zé)創(chuàng)建和管理享元角色.
如果只共享一個(gè)對(duì)象,那么享元模式像單例模式,享元中的工廠像簡(jiǎn)單工廠模式,以字母組合為例,字母的數(shù)量是固定的,我們只需要初始化固定的實(shí)例即可,不需要每次調(diào)用都重新初始化.
<pre><code>`class Flyweight {
var name:String = ""
convenience init(name:String) {
self.init()
self.name = name
}
func operation(action:String) { }
}
class LetterFlyweight:Flyweight {
override func operation(action: String) {
print("\(self.name)---執(zhí)行操作:\(action)")
}
}`</code></pre>
<pre><code>`class FlyweightFactory {
var map = [String : Flyweight]()
func create(key:String) {
if !map.keys.contains(key) {
map[key] = LetterFlyweight(name: key)
}
}
func opration(key:String,action:String) {
var weight:Flyweight?
if map.keys.contains(key) {
weight = map[key]
} else {
weight = LetterFlyweight(name: key)
}
weight?.operation(action: action)
}
}`</code></pre>
測(cè)試代碼:
<pre><code>` let factory:FlyweightFactory = FlyweightFactory()
factory.create(key: "A")
factory.create(key: "B")
factory.opration(key: "A", action: "共享字母A")`</code></pre>
優(yōu)點(diǎn):
降低了系統(tǒng)中對(duì)象的數(shù)量,從而降低了系統(tǒng)中細(xì)粒度對(duì)象給內(nèi)存帶來的壓力.
缺點(diǎn):
為了使對(duì)象可以共享,需要將一些狀態(tài)外部化,這使得程序的邏輯更復(fù)雜,使系統(tǒng)復(fù)雜化.
享元模式將享元對(duì)象的狀態(tài)外部化,而讀取外部狀態(tài)使得運(yùn)行時(shí)間稍微變長(zhǎng).
iOS 中UITableView重用機(jī)制就是享元模式的完美體現(xiàn).
參考鏈接
http://blog.jobbole.com/78083/
http://www.cnblogs.com/java-my-life/archive/2012/04/26/2468499.html