设计模式是有用的抽象工具,用于解决工程和建筑等其它领域的设计问题。出于同样的目的,软件开发领域借用了这一概念。设计模式是用于解决特定领域发生的特定问题。
单例模式是设计模式的一种。单例模式的使用保证一个类仅有一个实例,并提供一个访问它的全局访问点。
单例模式的作用:当一个‘A类’被设计成单例模式时,由‘类A’构造出的实例对象之于其它类来讲为全局实例对象,即在每一个类中由‘A’构造出的实例对像,都为相同的对象。
在OC中如何将一个类设计成单例对象?
1.在被设计成单例对象的类的.h文件中声明一个构造单例方法
2.在.m文件中实现该方法。
//Student.h文件
//引入NSCopying协议,防止通过copy产生新的对象
@interface Student : NSObject<NSCopying>
//创建一个类方法
+(Student *)shareInstance;
//声明一个静态的实例对象,只会执行一次
static Student *stu = nil;
@implementation Student
//实现方法
+(Student *)shareInstance{
//如果为空,则初始化一个stu对象,并返回stu
if(stu == nil)
{
stu = [[Student alloc]init]
}
return stu;
}
//为了防止alloc 或者new创建新的实例变量
+(id)allocWithZone:(struct _NSZone *)zone{
//使用@sychronized 设置一个互斥锁,保证此时不会受到其它线程的影响
@synchronized (self){
if(stu == nil){
stu = [super allocWithZone:zone];
}
}
return stu;
}
//为了防止copy产生新的对象。需要遵循NSCopying协议
-(id)copyWithZone:(NSZone *)zone{
return self;
}
以上三个方法其实时比较单例模式比较固定的写法。
因为当我们创建对象的时候,我们的方法有:
Student *student1 = [[Student alloc]init];
Student *student2 = [Student shareIntance];
Student *student3 = [student2 copy];
如果不将Student类设计成单例类,那么,这三种方法将创建三个不一样的对象。而如果使用单例设计模式,则产生的三个对象都是一样的。输出结果如下:
单例模式的实现思路:
一个类只能创建一个实例(永远是同一个人)和一个获得该实例的方法(必须是类方法,通常使用getInstance或者shareInstance等名字);当我们调用这个方法时,如果一个类的唯一实例不为空,就返回这个实例,如果一个类的唯一实例为空就创建该类的实例。