冯超

好好工作,天天向上

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

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                ifnull == 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
posted on 2005-07-20 21:43  超哥  阅读(491)  评论(0编辑  收藏  举报