Object-C 學習筆記(六)---單例設計模式

說到單例,在java學習07-單例設計模式已經說的很清楚,Object-C也是一門面向對象的語言,於是除了寫法不同,其他都是大同小異.

---未來會出一套 "設計模式"學習的筆記奮鬥


原則:

(1) 不能直接調用構造方法---私有

(2)對象內存只能初始化一次---static

(3)使用其他靜態接口(方法)把靜態的對象返回

廢話少說了,讓我們直接上程序吧.

//
//  People.h
//  Single
//  DRAGON
//  Created by 5016 on 13-12-2.
//  Copyright (c) 2013年 dradon. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface People : NSObject<NScopying>

//定義靜態方法
+(People *)getInstance;

@end


//
//  People.m
//  Single
//  DRAGON
//  Created by 5016 on 13-12-2.
//  Copyright (c) 2013年 dradon. All rights reserved.
//

#import "People.h"

@implementation People

static People *single = nil;

+(People *)getInstance
{
    @synchronized(self)//線程鎖,可以不使用,使用之後使線程安全,但是執行速率下降
    {
        if (!single) {
            single = [[[self class] alloc]init];
        }
    }
    return single;
}

#pragma mark 下面方法確保只有一個實例

//當調用alloc
+(id)allocWithZone:(NSZone *)zone
{
    if (!single) {
        single = [super allocWithZone:zone];
    }
    
    return single;
}

//覆蓋copy協議
-(id)copyWithZone:(NSZone *)zone
{
    return single;
}

-(id)retain
{
    return single;
}

-(oneway void)release
{
}

-(id)autorelease
{
    return single;
}

-(NSUInteger)retainCount
{
    return UINT_MAX;//返回一個>0的值
}

-(void)dealloc
{
    [super dealloc];
}

@end



//
//  main.m
//  Single
//  DRAGON
//  Created by 5016 on 13-12-2.
//  Copyright (c) 2013年 dradon. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "People.h"

int main(int argc, const char * argv[])
{
    People* person1 = [People getInstance];
    People* person2 = [People getInstance];
    
    //判斷是否爲同一對象堆內存空間
    if (person1 == person2) {
        NSLog(@"true");//當然是打印true
    }else{
        NSLog(@"false");
    }
    return 0;
}

筆者認爲單例不需要使用同步,靜態區是一個獨立的內存塊,靜態修飾的變量或方法隨着類的加載而加載,只初始化一次,優先與對象的存在,就算啓動多個線程,也不可能再初始化靜態對象,使用同步會使系統內部增加判斷,負載增加,程序執行降低效率….

但是,有時候同步是必要的,詳細可以去看同步控制單例,http://www.ibm.com/developerworks/cn/java/l-singleton/


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章