iOS 设计模式之单例

时间:2022-07-20 19:51:56

设计模式:

一.  单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。

单例模式的要点有三个:一是某个类只能有一个实例,二是它必须自行创建这个实例,三是它必须自行向整个系统提供这个实例。

二.单例模式结构图:

iOS 设计模式之单例

三. 单例的好处:

1.实例控制:单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。

2.灵活性:因为类控制了实例化过程,所以类可以灵活更改实例化过程

四.单例DEMO

单例的创建

.h文件

#import <Foundation/Foundation.h>

@interface Oneexample : NSObject<NSCopying>

+ (id) Oneexample;

@end

.m文件

先创建一个静态的类对象将他设为空

static Oneexample * oneexample = nil;

+ (id) Oneexample

{

//双重锁机制

if (oneexample == nil)//避免多次加锁

{

@synchronized(self)//一次只允许进入一个

{

if(oneexample == nil)

{

oneexample = [[[self class] alloc] init];

}

}

}

return oneexample;

}

一般来说我们写到现在就已经将单例创建出来了

但是由于单例是唯一的,我们自己创建的单例自己用时知道其用法,但是其他人用时不知到我们创建单例但方法,计入其使用了new alloc copy 就会创建出新的对象,这样我们创建的单例就显得毫无意义了,为了避免这种情况我们就需要在重新设置一下他的其他能够创建此对象的方法

设置new的方法

+ (id)new

{

return [self alloc];

}

设置alloc的方法

+ (id) allocWithZone:(NSZone *)zone

{

if (oneexample == nil)

{

@synchronized(self)

{

if (oneexample == nil)

{

oneexample = [super allocWithZone:zone];

}

}

}

return nil;

}

设置copy的方法

- (id) copyWithZone:(NSZone *)zone

{

return oneexample;

}

- (id) mutableCopyWithZone:(NSZone *)zone

{

return [self copyWithZone:zone];

}

重新设置这几种能创建对象的方法以后,我们不管如何穿件对象都能够保证这个对象是一个单例,此时我们封装的单例才是完美无缺的