2 Singleton模式
2.1 概述
Singleton模式是用于确保一个特定的类有且仅有一个对象被实例化。
2.2 设计
那么如何保证只生成一个对象呢?我们都知道,对象的生成是通过构造方法实现的。在C#中,我们实例化对象是这样写的:
Student student = new Student() ;//生成学生对象
其实在类Student实例化中,它是调用类的构造方法:public Student() {}
对于方法,都有访问行的限制,那么类Student的构造方法Student()的可访问行是public,所以可以通过此方法实例化无数个对象。
我们要使用Singleton模式,使类有且仅有一个对象,就必须限制所有构造方法的可访问行,使不能通过new 操作实例化对象,然后我们再提供一个接口,通过这个接口保证有且仅有一个对象被示例化。
那么如何做到这点呢?思维是这样的:在实例化对象之前,先看看有没有对象已被实例化,如果没有就实例化,否则就调用已实例化的对象。这里就有一个问题:如何让其他对象知道有没有对象被实例化?也就是说需要把实例化的仅有一个对象放在一个所有“人”能“看”到的地方。很幸运的时,C#语法有一个声明支持这个做法:static。那就好办了,把实例化的对象先放在一个static的类私有变量中(私有是不让类外人员改动),要再实例化对象时就先看看这个变量,如果这个变量不为空,就调用它;如果为空就实例化一个对象,并放入该变量中。
2.3 实现
UML图:
示例代码为:
1using System;
2
3namespace Example
4{
5 /// <summary>
6 /// 示例
7 /// </summary>
8 class Example
9 {
10 /// <summary>
11 /// 应用程序的主入口点。
12 /// </summary>
13 [STAThread]
14 static void Main(string[] args)
15 {
16 Student student1 = Student.GetStudent() ;
17 student1.Name = "FengChao" ;
18 Console.WriteLine( String.Format( "Student1'name is {0}." , student1.Name ) ) ;
19 //输入为Student1'name is FentChao.
20 Student student2 = Student.GetStudent() ;
21 Console.WriteLine( String.Format( "Student2'name is {0}." , student2.Name ) ) ;
22 //输入为Student2'name is FentChao.
23 //说明student1 和 student2 为同一个对象
24 }
25
26 /// <summary>
27 /// 学生
28 /// </summary>
29 public class Student
30 {
31 /// <summary>
32 /// 静态私有变量,存放唯一的对象
33 /// </summary>
34 private static Student student = null ;
35 private string name = String.Empty ;
36
37 private Student() {}
38 /// <summary>
39 /// 提供一个接口,可以从这里取得有且仅有的一个实例化对象
40 /// </summary>
41 /// <returns>Student</returns>
42 public static Student GetStudent()
43 {
44 if( null == student)
45 {
46 student = new Student() ;
47 }
48 return student ;
49 }
50 /// <summary>
51 /// 学生姓名
52 /// </summary>
53 public string Name
54 {
55 set { name = value ; }
56 get { return name ; }
57 }
58 }
59 }
60}
61
2
3namespace Example
4{
5 /// <summary>
6 /// 示例
7 /// </summary>
8 class Example
9 {
10 /// <summary>
11 /// 应用程序的主入口点。
12 /// </summary>
13 [STAThread]
14 static void Main(string[] args)
15 {
16 Student student1 = Student.GetStudent() ;
17 student1.Name = "FengChao" ;
18 Console.WriteLine( String.Format( "Student1'name is {0}." , student1.Name ) ) ;
19 //输入为Student1'name is FentChao.
20 Student student2 = Student.GetStudent() ;
21 Console.WriteLine( String.Format( "Student2'name is {0}." , student2.Name ) ) ;
22 //输入为Student2'name is FentChao.
23 //说明student1 和 student2 为同一个对象
24 }
25
26 /// <summary>
27 /// 学生
28 /// </summary>
29 public class Student
30 {
31 /// <summary>
32 /// 静态私有变量,存放唯一的对象
33 /// </summary>
34 private static Student student = null ;
35 private string name = String.Empty ;
36
37 private Student() {}
38 /// <summary>
39 /// 提供一个接口,可以从这里取得有且仅有的一个实例化对象
40 /// </summary>
41 /// <returns>Student</returns>
42 public static Student GetStudent()
43 {
44 if( null == student)
45 {
46 student = new Student() ;
47 }
48 return student ;
49 }
50 /// <summary>
51 /// 学生姓名
52 /// </summary>
53 public string Name
54 {
55 set { name = value ; }
56 get { return name ; }
57 }
58 }
59 }
60}
61