zoukankan      html  css  js  c++  java
  • 设计模式——Singleton模式

    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
  • 相关阅读:
    codevs 2632 非常好友
    codevs 1213 解的个数
    codevs 2751 军训分批
    codevs 1519 过路费
    codevs 1503 愚蠢的宠物
    codevs 2639 约会计划
    codevs 3369 膜拜
    codevs 3135 River Hopscotch
    数论模板
    JXOJ 9.7 NOIP 放松模拟赛 总结
  • 原文地址:https://www.cnblogs.com/fengchao/p/196928.html
Copyright © 2011-2022 走看看