单例模式定义
单例模式(Singleton Pattern):单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。
单例模式由来
当我们有一些昂贵的资源或者唯一性的资源,构建成本高或者不允许被复制的情况下,需要利用语言特性来保证对象实例的唯一性。而且这个类可以保证没有其他实例被创建,并且它可以提供一个访问该实例的方法。这就是单例模式的由来。
单例模式结构
-
Singleton: 单例
类自身负责保存它的唯一实例,并且它可以提供一个访问该实例的方法
单例模式特点
- 单例类的构造函数为私有
- 提供一个自身的静态私有成员变量
- 提供一个公有的静态工厂方法
单例模式实现
1、创建单例类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Singleton {
//单例,使用 static 使其可在factory中调用
static final Singleton _singleton = Singleton._();
// 方案一: 静态方法暴露唯一实例
static Singleton getInstance() => _singleton;
// 方案二: 工厂方法
factory Singleton() => _singleton;
// 方案三: 静态属性暴露唯一实例
static Singleton get instance => _singleton;
//单例构造方法,需私有
Singleton._() {
print("私有构造器,初始化配置/参数");
}
}
2、使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void main(List<String> args) {
Singleton s = Singleton();
Singleton s1 = Singleton._singleton;
Singleton s2 = Singleton.getInstance();
Singleton s3 = Singleton.instance;
print(s.hashCode);
print(s1.hashCode);
print(s2.hashCode);
print(s3.hashCode);
print(s == s1);
print(s1 == s2);
print(s2 == s3);
}
3、输出结果
1
2
3
4
5
6
7
8
9
10
Connecting to VM Service at http://127.0.0.1:53786/2VA6KIpZV5M=/
私有构造器,初始化配置/参数
516711214
516711214
516711214
516711214
true
true
true
Exited
4、分析
创建单例类我们可以通过三种方式,创建出来的对象都是唯一的实例。
总结
优点
- 提供了对唯一实例的受控访问,保证一个类仅有一个实例。
- 在系统内存中值存在一个对象,节约系统资源,对于需要频繁创建和销毁的对象,单例模式可以提高系统的性能
缺点
- 单例无法抽象,扩展困难
- 单例类职责过重,一定程度上违背“单一职责原则”