当前位置: 萬仟网 > IT编程>软件设计>设计模式 > 单例模式的了解

单例模式的了解

2020年09月28日  | 萬仟网IT编程  | 我要评论
什么是单例模式单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问。 比如在有些进程当中,我们经常会用到用户信息,这就要求我们能够把用户信息存在一个统一的对象当中,以便于在整个进程中对信息进行增删查找等操作。通过上面这一段话,我们就大概了解了单例模式到底是个什么东西了。所谓单例模式,就是整个进程只存在一个实例对象的类。所以它的生命周期也就是进程的生命周期。只要app不被干掉,实例对象就不会被释放。使用

什么是单例模式和单例类

单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问。比如你上了一个需要注册的网站,然后你点一下注册按钮就会跳出来一个需要填写信息的页面,如果你没有对这个页面使用单例模式 你再点一下注册,就会又跳出一个相同的页面,使用单例模式过后,作用就是在没有把上一个填写信息的页面关闭之前是不会再跳出一个相同的页面的,。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。
而单例类在编译时进行初始化,然后一直保存在内存中,直到程序退出时由系统自动释放这部分内存。只要程序还在运行就会一直占用内存。

其实系统给我们提供了很多的单例类。
[UIApplication sharedApplication]; //应用程序实例类
[NSNotificationCenter defaultCenter];//消息中心实例类
[NSFileManager defaultManager];//文件管理实例类
[NSUserDefaults standardUserDefaults];//应用程序设置
[NSURLCache sharedURLCache];//请求缓存实例类

单例模式的优缺点

优点
1、整个项目中只会实例化一次;
2、在整个项目中只实例化一个对象,节省系统内存,提高程序的运行效率
缺点
1、不能被重写、不能被继承、不能被扩展
2、创建单例对象之后,只要程序一直运行就一直占用这系统的内存,在不用该对象的时候也不能销毁消耗着系统的内存

在简单了解了单例模式之后,我们就可以开始创建一个单例模式了:

单例模式的创建

创建一个类,继承于NSObject

// MYSingleton.h

@interface  MYSingleton : NSObject
//方法前面一个加号表示这个方法是一个类方法,类方法是无需实例化就可以直接用这个类去调用的方法 不需要分配内存空间。
//获取单例
+ (instancetype)shareSingleton;

@end
// MYSingleton.m
//定义一个全局变量
//为单例对象实现一个静态实例,并初始化,然后设置成nil, 
static MYSingleton *_instance = nil;
//实现一个实例构造方法检查上面声明的静态实例是否为nil,
//如果是则新建并返回一个本类的实例, 
+ (MYSingleton)shareSingleton {
	@synchronized(self) {
		if(_instance == nil) {
			[[self alloc] init];
		}
	}
	return _instance;
}
//不管是使用alloc还是使用allocWithZone方法,其默认执行的都是allocWithZone方法。
//所以这里选择重写了allocWithZone方法,
//所以可以保证其他人直接使用alloc和init试图获得一个新实例时不产生一个新实例,  
+ (id)allocWithZone:(NSZone *)zone {
	@synchronized(self) {
		if(_instance == nil) {
			[[self alloc] init];
			return _instance;
		}
	}
	return _instance;
}

- (id)copyWithZone:(NSZone *)zone {
	return self;
}

- (id)mutableCopyWithZone:(NSZone *)zone{
    return self;
}
//viewController.m
- (void)viewDidLoad {
	[super viewDidLoad];
	 MYSingleton *singleton = [ MYSingleton shareSingleton];
     MYSingleton *allocThis = [[ MYSingleton alloc] init];
     NSLog(@"%@, %@", singleton, allocThis);
}

上面控制通过shareSingleton()和alloc方法来获取MYSingleton实例时,程序最多只会产生一个Singleton实例。在viewDidLoad()函数中调用两种方法,并且打印它们各自的地址,可以发现地址是一样的,所以程序中自始至终都只有一个单例实例。

下面这个就是苹果官方的单例写法:

要是对写法还有疑惑的,可以参考苹果官方的单例写法。

本文地址:https://blog.csdn.net/weixin_45708424/article/details/108828312

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
Copyright © 2017-2020  萬仟网 保留所有权利. 粤ICP备17035492号