使用Object-C实现23种设计模式之单例模式

来源:互联网 发布:淘宝卖家陈曦 编辑:程序博客网 时间:2024/05/19 13:14

今天给大家讲解一下第四种创建模式——单例模式,单例模式不同于前几种,前几种更注重逻辑,而单例模式则偏重于内存管理以及实际运用,相对前几种要相对简单。

所谓单例模式,就是一种让某个类只产生单一实例的模式,不管通过何种方法获得的实例,其指向的内存地址均相同,这块内存被所有实例所共享,这种模式不仅有效的节约了内存,避免了不必要的内存浪费,而且还在某一程度上消除了实例之间的二义性。

Windows操作系统当中的回收站就是典型的单例模式的应用场景,试想,如果电脑操作系统当中存在两个回收站,会是怎样一种场景?首先,你要删除的东西系统不知道要放入哪一个回收站,其次,会造成很大程度上的内存资源浪费,再次,完全不符合应用逻辑,不便于管理。

下面,就以回收站为例,简单介绍一下单例模式的实现。

首先,定义一个RecycleBin类(回收站类),在类的内部添加一个静态的变量,作为唯一的共享变量。

RecycleBin.h

#import <Foundation/Foundation.h>


@interface RecycleBin : NSObject


+(id)getRecycleBin;//返回实例的方法,当共享变量为nil是,开辟一个新的空间给共享变量,当共享变量不为空时,返回该共享变量


@end


RecycleBin.m

#import "RecycleBin.h"


@interface RecycleBin()

-(instancetype)init;//init方法私有

@end;


static RecycleBin* _instance =nil;//静态变量


@implementation RecycleBin


+(id)getRecycleBin{

    if(_instance ==nil){

        _instance = [[RecycleBinalloc]init];

    }

    return_instance;

}


-(instancetype)init{

    return self;

}


-(id)copyWithZone:(NSZone*)zone{//重写copy方法,当执行copy函数时,返回该共享变量

    return_instance;

}


+(id)allocWithZone:(struct_NSZone *)zone{//重写alloc方法

    @synchronized (self) {

        if(!_instance){

            _instance = [superallocWithZone:zone];

            return _instance;

        }

    }

    return_instance;

}


@end

总之,单例模式需要把所有可能产生新对象的方法重写,使之返回的对象为类中的唯一的共享变量。

下面,对本程序做一下测试:

#import <Foundation/Foundation.h>

#import "RecycleBin.h"

int main(int argc,constchar * argv[]) {

    @autoreleasepool {

        RecycleBin *recycleBin1 = [RecycleBingetRecycleBin];

        RecycleBin *recycleBin2 = [RecycleBingetRecycleBin];

        RecycleBin *recycleBin3 = [recycleBin1copy];

        RecycleBin *recycleBin4 = [RecycleBinalloc];

        NSLog(@"%@",recycleBin1);

        NSLog(@"%@",recycleBin2);

        NSLog(@"%@",recycleBin3);

        NSLog(@"%@",recycleBin4);

    }

    return 0;

}

输出结果如下:

2016-05-23 22:38:50.560 设计模式之四单例模式[944:48960] <RecycleBin: 0x100204b00>

2016-05-23 22:38:50.561 设计模式之四单例模式[944:48960] <RecycleBin: 0x100204b00>

2016-05-23 22:38:50.562 设计模式之四单例模式[944:48960] <RecycleBin: 0x100204b00>

2016-05-23 22:38:50.562 设计模式之四单例模式[944:48960] <RecycleBin: 0x100204b00>

Program ended with exit code: 0




可以看到,这四个变量的内存地址均相同,测试成功。

以上为我个人对单例模式的简单理解,如有不到之处,敬请批评指正。

未完待续。。。


0 0