Swift-享元(Flyweight)模式

享元模式:運(yùn)用一個(gè)共享來避免大量擁有相同內(nèi)容對(duì)象的開銷.這種開銷中最常見、直觀的就是內(nèi)存的損耗.享元模式以共享的方式高效的支持大量的細(xì)粒度對(duì)象.

享元模式.png

享元模式所涉及到的角色:

抽象享元(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 定義 Flyweight在拳擊比賽中指最輕量級(jí),即“蠅量級(jí)”或“雨量級(jí)”。這里選擇使用“享元模式”的意譯,是因?yàn)檫@...
    步積閱讀 1,648評(píng)論 0 2
  • 設(shè)計(jì)模式匯總 一、基礎(chǔ)知識(shí) 1. 設(shè)計(jì)模式概述 定義:設(shè)計(jì)模式(Design Pattern)是一套被反復(fù)使用、多...
    MinoyJet閱讀 3,978評(píng)論 1 15
  • 1 場(chǎng)景問題# 1.1 加入權(quán)限控制## 考慮這樣一個(gè)問題,給系統(tǒng)加入權(quán)限控制,這基本上是所有的應(yīng)用系統(tǒng)都有的功能...
    七寸知架構(gòu)閱讀 2,514評(píng)論 1 57
  • 享元模式(Flyweight Pattern):運(yùn)用共享技術(shù)有效地支持大量細(xì)粒度對(duì)象的復(fù)用。系統(tǒng)只使用少量的對(duì)象,...
    breezedancer閱讀 1,923評(píng)論 2 51
  • 和看過央視主持人董卿的節(jié)目《朗讀者》里每一個(gè)朗讀者講述的情景一樣,我深刻地,堅(jiān)定地,平和地接受著這世界的人人事事,...
    方特羅伊閱讀 252評(píng)論 1 2