Singleton Pattern - 單例模式

Singleton pattern:單例模式是一種常用的軟件設(shè)計模式。在它的核心結(jié)構(gòu)中只包含一個被稱為單例類的特殊類膀哲。通過單例模式可以保證系統(tǒng)中一個類只有一個實例而且該實例易于外界訪問拗慨,從而方便對實例個數(shù)的控制并節(jié)約系統(tǒng)資源豌鹤。如果希望在系統(tǒng)中某個類的對象只能存在一個沪袭,單例模式是最好的解決方案艇抠。

以上內(nèi)容來自百度百科默怨。

單例模式的基本思路:


  1. 為單例對象實現(xiàn)一個靜態(tài)實例讯榕,設(shè)置成 nil。
  2. 調(diào)用時檢查是否為 nil,是則創(chuàng)建否則直接使用愚屁。
  3. 修改alloc等方法济竹,預(yù)防被創(chuàng)建新實例。
  4. 本質(zhì)上霎槐,每次調(diào)用單例對象的實例方法送浊,就只是創(chuàng)建了指針來指向該單例對象已經(jīng)分配好的內(nèi)存。

Objective - C 實現(xiàn)單例方法1


  • 在 .h 文件中加入類工廠方法:
#import <Foundation/Foundation.h>

@interface SingletonGeekBand : NSObject

+(SingletonGeekBand *)shared;

@end
  • 在 .m 文件中加入方法實現(xiàn)丘跌。
 #import "SingletonPattern.h"

// 建立靜態(tài)變量
static SingletonPattern * shared = nil;

@implementation SingletonPattern

// 類工廠方法袭景,如果 shared 還沒初始化則初始化,否則直接調(diào)用
+ (SingletonPattern *)shared {
    // 確保單線程
    @synchronized(self) {
        if (shared == nil) {
            shared = [[self alloc] init];
        }
    }
    return shared;
}

// 重寫 alloc 方法闭树,確保不會被重新分配新的實例內(nèi)存耸棒。
+(instancetype)alloc {
    @synchronized(self) {
        if (shared == nil) {
            shared = [super alloc];
            return shared;
        }
    }
    return shared;
}

// 重寫 allocWithZone
+ (id)allocWithZone:(struct _NSZone *)zone {
    @synchronized(self) {
        if (shared == nil) {
            shared = [super allocWithZone:zone];
            return shared;
        }
    }
    return nil;
}

// 重寫 copyWithZone
+ (id)copyWithZone:(NSZone *)zone {
    return self;
}

@end

Objective - C 實現(xiàn)單例方法2


  • 在 .h 文件中加入類工廠方法:
#import <Foundation/Foundation.h>

@interface Singleton : NSObject

+ (instancetype) shareInstance;

@end
  • 在 .m 文件中加入方法實現(xiàn)。
#import "Singleton.h"

@implementation Singleton

+ (instancetype) shareInstance {
    static dispatch_once_t dispatch = 0;
    static Singleton * instance;
    dispatch_once(&dispatch,^{
        instance = [[Singleton hiddenAlloc] init];
    });
    return instance;
}

+ (instancetype)alloc {
    return [self shareInstance];
}

+ (instancetype)hiddenAlloc {
    return [super alloc];
}

@end

Swift 實現(xiàn)單例


基本思路:

  • 把下面類方法復(fù)制到要實現(xiàn)單例的類當中报辱,并且將第1,4,7行的 ClassName 置換成類名稱与殃。
class func shareInstance() -> ClassName { // Change here!
    struct SingletonStruct {
        static var predicate: dispatch_once_t = 0
        static var instance: ClassName? = nil // Change here!
    }
    dispatch_once(&SingletonStruct.predicate, {
            SingletonStruct.instance = ClassName() // Change here!
        }
    )
    return SingletonStruct.instance!
}

例如我創(chuàng)建了一個繼承自UIView的類,singletonView:

class SingletonView:UIView {
    class func shareInstance() -> SingletonView {
        struct SingletonStruct {
            static var predicate: dispatch_once_t = 0
            static var instance: SingletonView? = nil
        }
        dispatch_once(&SingletonStruct.predicate, {
            SingletonStruct.instance = SingletonView()
            }
        )
        return SingletonStruct.instance!
    }
}
  • 在使用到的位置創(chuàng)建兩個變量 testValueA捏肢,testValueB 通過 shareInstance 初始化并且調(diào)用奈籽。因為繼承自UIView,所以我可以調(diào)用所有UIView的方法鸵赫。而且衣屏,只要我改變了 testValue 當中的任何屬性,testValueB 也會一起更改辩棒。
    注意單例在整個程序中只有一個狼忱,所以如果改變了其中一個變量的內(nèi)容,那另一個變量也會隨之改變一睁。
var testValueA             = SingletonView.shareInstance()
testValueA.frame           = CGRectMake(0, 0, 100, 100)
testValueA.backgroundColor = UIColor.blueColor()
var testValueB             = SingletonView.shareInstance()
if testValueA == testValueB {
    print("YES")
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末钻弄,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子者吁,更是在濱河造成了極大的恐慌窘俺,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件复凳,死亡現(xiàn)場離奇詭異瘤泪,居然都是意外死亡,警方通過查閱死者的電腦和手機育八,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門对途,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人髓棋,你說我怎么就攤上這事实檀』讨蓿” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵膳犹,是天一觀的道長恬吕。 經(jīng)常有香客問我,道長镣奋,這世上最難降的妖魔是什么币呵? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮侨颈,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘芯义。我一直安慰自己哈垢,他們只是感情好,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布扛拨。 她就那樣靜靜地躺著耘分,像睡著了一般。 火紅的嫁衣襯著肌膚如雪绑警。 梳的紋絲不亂的頭發(fā)上求泰,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天,我揣著相機與錄音计盒,去河邊找鬼渴频。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播裙犹,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼荠藤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了盟萨?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎逛万,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體批钠,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡宇植,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了价匠。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片当纱。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖踩窖,靈堂內(nèi)的尸體忽然破棺而出坡氯,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布箫柳,位于F島的核電站手形,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏悯恍。R本人自食惡果不足惜库糠,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望涮毫。 院中可真熱鬧瞬欧,春花似錦、人聲如沸罢防。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽咒吐。三九已至野建,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間恬叹,已是汗流浹背候生。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留绽昼,地道東北人唯鸭。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像绪励,于是被迫代替她去往敵國和親肿孵。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

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

  • 單例模式(Singleton Pattern)是 Java 中最簡單的設(shè)計模式之一疏魏。這種類型的設(shè)計模式屬于創(chuàng)建型模...
    _凌浩雨閱讀 1,227評論 0 1
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理停做,服務(wù)發(fā)現(xiàn),斷路器大莫,智...
    卡卡羅2017閱讀 134,711評論 18 139
  • 1 場景問題# 1.1 讀取配置文件的內(nèi)容## 考慮這樣一個應(yīng)用蛉腌,讀取配置文件的內(nèi)容。 很多應(yīng)用項目只厘,都有與應(yīng)用相...
    七寸知架構(gòu)閱讀 6,799評論 12 68
  • 單例模式(SingletonPattern)一般被認為是最簡單烙丛、最易理解的設(shè)計模式,也因為它的簡潔易懂羔味,是項目中最...
    成熱了閱讀 4,257評論 4 34
  • 今天星期天媚值,我休班狠毯,我們計劃上午去金溝集給二寶買鞋子,下午陪大寶去書店褥芒。下午2點左右嚼松,我們從家出發(fā),因為要給...
    軒萌媽閱讀 243評論 0 0