最近2018中文字幕在日韩欧美国产成人片_国产日韩精品一区二区在线_在线观看成年美女黄网色视频_国产精品一区三区五区_国产精彩刺激乱对白_看黄色黄大色黄片免费_人人超碰自拍cao_国产高清av在线_亚洲精品电影av_日韩美女尤物视频网站

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
23種設(shè)計模式——單例模式

注:本博文來作者的其他博客GeekerProbe,但是均為原創(chuàng),要獲得最佳閱讀效果請移步至GeekerProbe。

在五大連池等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站制作、成都網(wǎng)站建設(shè) 網(wǎng)站設(shè)計制作按需網(wǎng)站策劃,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站建設(shè),營銷型網(wǎng)站建設(shè),成都外貿(mào)網(wǎng)站建設(shè)公司,五大連池網(wǎng)站建設(shè)費用合理。


本學(xué)期開了一門課程叫做《軟件體系結(jié)構(gòu)》,講的主要是設(shè)計模式的東西,而我在之前也看過設(shè)計模式的書,正好借此機會來整理一下自己所學(xué)到的知識,因為自己在做iOS開發(fā),所以基本上這23種設(shè)計模式我都通過objective-C來實現(xiàn)了。此系列文章的類圖都是來自《設(shè)計模式之禪》,有興趣的同學(xué)可以去買這本書看。

話說,在編碼編到一定的程度以后,由于代碼體系的龐大,結(jié)構(gòu)的復(fù)雜,自然就會上升到設(shè)計模式高度,而現(xiàn)在的軟件設(shè)計又基本都是面向?qū)ο蟮?,所以有了設(shè)計模式作支持,可以使軟件更加的穩(wěn)定安全,也更易于維護與拓展。

首先來介紹最常用最簡單的單例模式(Singleton),在以后的文章中再依次介紹其他的模式。

單例模式定義

Ensure a class has only one instance, and provide a global point of access to it. (確保某一個類只有一個實例,而且自行實例化并向整個系統(tǒng)提供這個實例。)

單例模式類圖
單例模式介紹

單例模式確保在一個應(yīng)用中只產(chǎn)生一個實例,這是很有必要的,因為在我們做軟件設(shè)計的時候,有很多對象都是只需要一個就可以了,而不需要創(chuàng)建眾多的對象,這樣最顯而易見的就是節(jié)省了內(nèi)存空間。而且避免了這個類的頻繁的初始化與銷毀。有時為了實現(xiàn)某一種功能與操作而創(chuàng)建的類(工具類)往往也不需要多個對象,使用單例模式再合適不過。再延伸一點,有時為了節(jié)省內(nèi)存對一個對象進行復(fù)用的話也可以通過單例來實現(xiàn),這在手機軟件的開發(fā)中用得比較多,因為手機的內(nèi)存實在是少得可憐。

單例模式優(yōu)點
  1. 正如前面說的,單例模式在內(nèi)存中只有一個實例,減少了內(nèi)存開支。特別是一個對象需要頻繁的創(chuàng)建、銷毀時,而創(chuàng)建與銷毀的性能有無法優(yōu)化,單例模式的優(yōu)勢就非常明顯。

  2. 單例模式只生成一個實例,減少了系統(tǒng)性能開銷,當(dāng)一個對象的產(chǎn)生需要比較多的資源時,如讀取配置、產(chǎn)生其他依賴對象時,則可以通過在應(yīng)用啟動時直接產(chǎn)生一個單例對象,然后永久駐留內(nèi)存的方式來解決。

  3. 單例模式可以避免對資源的多重占用。

  4. 單例模式可以在系統(tǒng)設(shè)置全局的訪問點,優(yōu)化和共享資源訪問。

單例模式缺點
  1. 單例模式一般沒有接口,擴展很困難,除了修改代碼基本上沒有第二種途徑實現(xiàn)。

  2. 單例模式對測試是不利的。在并行開發(fā)環(huán)境中,如果單例模式?jīng)]有完成,是不能進行測試的。

  3. 單例模式與單一職責(zé)原則有沖突。

單例模式在iOS中的使用

單例模式在iOS開發(fā)中的使用還是蠻多的,許多Foundation、CocoaUIKit中的類都實現(xiàn)了單例模式,比如應(yīng)用程序本身UIApplication、文件操作類NSFileManager、消息中心NSNotificitonCenter等系統(tǒng)都已經(jīng)給我們實現(xiàn)單例,我們只需要使用就好了。在iOS中使用單例模式要使用類方法,通過類方法返回該類的唯一對象。

我知道的在iOS開發(fā)中實現(xiàn)單例模式主要有以下三種方式:

第一種

該方法是蘋果的官方文檔中寫的一種方式,通過覆蓋NSObject的部分方法實現(xiàn),使該類無法allocretain、release。這是最麻煩的一種方法,也是最不好的一種方法。

static Singleton *instance = nil;
+ (Singleton *)sharedInstance
{
    if (instance == nil) {
        instance = [[super allocWithZone:NULL] init];
    }
    return instance;
}
+ (id)allocWithZone:(NSZone *)zone
{
    return [[self sharedInstance] retain];
}
- (id)copyWithZone:(NSZone *)zone
{
    return self;
}
- (id)retain
{
    return self;
}
- (NSUInteger)retainCount
{
    return NSUIntegerMax;  //denotes an object that cannot be released
}
- (void)release
{
    //do nothing
}
- (id)autorelease
{
    return self;
}

可以看到這種方式,使用靜態(tài)成員維持了一個永久存在的對象,而且覆蓋了alloc方法(alloc方法會調(diào)用allocWithZone:方法),并且也覆蓋了所有與引用技術(shù)有關(guān)的方法,這都使這個對象不會被銷毀。這樣看上去基本實現(xiàn)了我們需要的,但是寫起來麻煩不說,還有很大的一個問題,那就是多線程問題,如果是在多線程中那么該種方法就不能保證只產(chǎn)生一個對象了。所以這種方式只是介紹一下,并不推薦使用。

第二種

第二種跟第一種差不多,也是通過覆蓋NSObject的方法實現(xiàn)的,但是它在第一種的基礎(chǔ)上增加了多線程的處理,所以即使在多線程下,該種方法創(chuàng)建的對象也是唯一的。這種方法已經(jīng)有大牛為我們寫好了,全都都是通過C的宏定義#define出來了。現(xiàn)給出該頭文件的下載地址:

SynthesizeSingleton.h

使用時也非常方便,該頭文件也已給出使用方法,在這里我在說一下,供那些E文不好的同學(xué)使用。

使用這種方式首先把該頭文件加到我們的項目中,然后直接使用就可以了:

#import 
#import "SynthesizeSingleton.h"
@interface Singleton : NSObject
SYNTHESIZE_SINGLETON_FOR_CLASS_HEADER(Singleton);
//定義該類的屬性,方法等
@end
@implementation Singleton
SYNTHESIZE_SINGLETON_FOR_CLASS(Singleton);
//屬性方法的實現(xiàn)
@end

如此一來在使用時,通過[Singleton sharedInstance]就可以獲得該類的單例對象了。這種方法由于有了這個頭文件的支持,所以使得使用單例方便多了,而且也避免了多線程的問題。

第三種

這是最后一種也是我最推薦的一種。iOS在4.0以后推出了blockGCD,這兩個特性給iOS開發(fā)帶來的很大的便利,也使開發(fā)變得更加趣味話。那么如何通過GCD+block來實現(xiàn)單例模式呢,這主要歸功于dispatch_once(dispatch_once_t *predicate, ^(void)block)這個GCD的函數(shù),他有兩個參數(shù)第一參數(shù)是一個指向dispatch_once_t類型結(jié)構(gòu)體的指針,用來測試block是否執(zhí)行完成,該指針?biāo)赶虻慕Y(jié)構(gòu)體必須是全局的或者靜態(tài)的,第二個參數(shù)是一個返回值與參數(shù)均為空的block,在block體中進行對象的初始化即可。dispatch_once在程序的生命周期中保證只會被調(diào)用一次,所以在多線程中也不會有問題。該種方法使用方法:

+ (Singleton *)sharedInstance
{
    static Singleton *instance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [[Singleton alloc]init];
    });
    return instance;
}

使用該種方法只需要這簡單的幾句代碼就可以實現(xiàn)單例了。使用起來非常方便,但是這種創(chuàng)建單例的方法也不是完美的,它并不能阻止人們通過alloc方法來實例化一個對象,所以這并不是嚴格意義上的單例模式,但是一般程序都是我們自己寫,我們自己記得就好了,這也沒什么可擔(dān)心的,從這一點上來說第二種方法又是比較好的,具體使用的時候呢,根據(jù)實際情況來吧,各取所需就好了。


網(wǎng)頁名稱:23種設(shè)計模式——單例模式
轉(zhuǎn)載源于:http://fisionsoft.com.cn/article/ipgscc.html