单例模式在程序设计中是一种很重要的设计模式,它的核心思想是单例类在应用程序的整个生命周期中的实例都只存在一个(当然也可以不存在).
不管哪种编程语言,单例的底层实现方法都是差不多的,就是使用类的私有静态指针变量指向类的唯一实例,并用一个仅有的静态方法来获取该实例.
举个例子:
我们办公室里有5个人,然后办公室里有一台打印机.办公室里所有人的电脑都连接着这个打印机,但是不管谁要打印东西,都要通过这个唯一的打印机,所以我们办公室里的这台打印机就可以理解为"打印机类"的单例对象.这样设计的好处就是可以节约资源,减少不必要的请求等.
在iOS开发中,经常会用到单例,比如我们常用的NSUserDefaults(Swift中为UserDefaults)类,就是一个单例类,原因很明显,不管什么时候往里面写东西,其实都是对同一个实例进行操作,不管什么时候往外读取,也都是从这个实例进行操作,所以就有了
[NSUserDefaults standardUserDefaults];
(UserDefaults.standard)
一般情况下,使用"shared" "sharedInstance" "default" "standard"等字样的,就是单例.
我们在自己开发的过程中,也可以参考这种单例模式,比如说一个Singleton单例类
在OC中设计单例:
在.h文件中开放单例类方法的接口:
+ (instanceType)sharedInstance;
在.m文件中实现如下:
首先声名一个静态对象:
static Singleton *sharedInstance = nil;
然后使用GCD中的dispatch_once_t实现接口中的单例类方法
+ (instanceType )sharedInstance {
static dispatch_once_t once;
dispatch_once(&once, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
这样在其他地方就可以使用
[Singleton sharedInstance];
来获取该单例对象了.
在Swift(3.0之后)设计单例:
swift中实现单例设计简单到爆:
固定写法:
static let sharedInstace = Singleton.init()
这样通过
Singleton.sharedInstace
就可以获取单例对象了.
但是这样做,在使用中仍然可以通过
Singleton.init()
来初始化一个非单例对象,为了明确告诉使用者应当使用单例,可以单例类中再加一句代码:
private override init() {}
将默认的init()方法重写为私有方法,这样在使用时直接调用init()方法就会报错.