建立型模式(Creational Patterns)提供了一种在建立对象的同时隐藏建立逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例须要建立哪些对象时更加灵活。建立型模式有多种,本文将简单介绍其中的单例模式(Singleton Pattern)与原型模式(Prototype Pattern),这两种设计模式都是处理对象建立的设计模式。数据库
单例模式能够说是最经常使用的设计模式之一。单例模式涉及到一个单一的类,该类负责建立本身的对象,同时确保只建立这个类的一个实例。这个类提供了一种访问其惟一的对象的方式,能够直接访问,不须要外部实例化该类的对象。 简单来讲,单例模式具备如下 3 个特色:编程
单例模式是编程中应用比较多的一种设计模式。比较常见的应用场景有:设计模式
单例模式在多线程的应用场合下必须当心使用。若是当惟一实例还没有建立时,有两个线程同时调用建立方法,那么它们同时没有检测到惟一实例的存在,从而同时各自建立了一个实例, 这样就有两个实例被构造出来,从而违反了单例模式中实例惟一的原则,所以在使用时须要保证其线程安全。此外,因为单例模式使得对象是能够全局访问和修改的,在实现该类时对于其中的一些变量也应当保证线程读写安全。缓存
+ (instancetype)sharedInstance {
static id sharedInstance = nil;
static dispatch_once_t onceToken = 0;
dispatch_once(&onceToken, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
复制代码
优势:安全
缺点:bash
所谓原型模式就是用原型实例指定建立对象的种类,而且经过复制这些原型建立新的对象。原型模式能够说是全部设计模式中最简单的一种,其核心就是实现一个原型接口,该接口用于建立当前对象的克隆。当直接建立对象的代价比较大时,则采用这种模式。例如,一个对象须要在一个高代价的数据库操做以后被建立。咱们能够缓存该对象,在下一个请求时返回它的克隆,在须要的时候更新数据库,以此来减小数据库调用。多线程
原型模式十分简单,只须要实现 clone 接口便可。但 clone 时须要注意深拷贝和浅拷贝的区别。工具
浅拷贝:使用一个已知实例对新建立实例的成员变量逐个赋值,这个方式被称为浅拷贝。性能
深拷贝:当一个类的拷贝构造方法,不只要复制对象的全部非引用成员变量值,还要为引用类型的成员变量建立新的实例,而且初始化为形式参数实例值。ui
简单来讲,对于对象 A 引用对象 B,对 A 进行浅拷贝得到的是对象 A1 引用对象 B,对 A 进行深拷贝得到的是对象 A1 引用对象 B1。
优势:
缺点:
原型模式是在已指定对象的基础上,而后经过拷贝这些原型对象建立新的对象。而单例模式模式的核心是将类的构造方法私有化,以后在类的内部产生实例化对象,并经过静态方法返回实例化对象的应用。