周银辉
单件模式用于提供一种机制或方法来使得我们可以控制类对象的创建个数,顾名思义它使得系统中某类对象的数目只有一个,当然它也可以用于实现固定数量对象的创建。
意图:
保证一个类只有一个实例,并提供一个该实例的全局访问点
结构:
![singleton.PNG](https://i-blog.csdnimg.cn/blog_migrate/c69383c6e89e0e51f592c70e372d42db.png)
怎么办?
我们的目的很明确,我们不允许外界任意的调用我们的构造方法来构造类对象,而仅仅为外界提供一个唯一的对象,那么很自然地会联想到如下代码:
1
public
class
MyClass
2 {
3 private MyClass()
4 {
5 }
6
7 public static GetMyClassObj()
8 {
9 //
10 }
11 }
其中为了防止外界对构造器的访问,我们将构造器的权限设置为private,我们提供一个方法(或属性)来允许外界访问特定的唯一的对象.那么将代码补充完整后为:
2 {
3 private MyClass()
4 {
5 }
6
7 public static GetMyClassObj()
8 {
9 //
![dot.gif](/Images/dot.gif)
10 }
11 }
1
public
class
MyClass
2 {
3 private static readonly MyClass myObj = new MyClass();
4
5 private MyClass()
6 {
7 }
8
9 public static GetMyClassObj()
10 {
11 return myObj;
12 }
13 }
2 {
3 private static readonly MyClass myObj = new MyClass();
4
5 private MyClass()
6 {
7 }
8
9 public static GetMyClassObj()
10 {
11 return myObj;
12 }
13 }
应该注意的几点:
1,我们不应该来序列化和反序列化用单件模式实现的对象,否则多次反序列化则可以创建多的实例,这与单件模式是相矛盾的.
2,我们不应该克隆用单件模式实现的对象,否则多次克隆则可以创建多的实例,这与单件模式是相矛盾的.
3,在多线程环境中使用单件模式时要小心.