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
  • 相关阅读:
    HDU 1160 dp中的路径问题
    zzuli 1907: 小火山的宝藏收益
    POJ 3414 dfs广搜直接应用
    http://acm.zzuli.edu.cn/zzuliacm/problem.php?cid=1158&pid=5 二分函数的间接应用
    LightOJ 1067 组合数取模
    九段美到极致的句子
    质数和分解
    codevs 1080 线段树练习
    codevs 2806 红与黑
    codevs 2152 滑雪
  • 原文地址:https://www.cnblogs.com/fengchao/p/196928.html
Copyright © 2011-2022 走看看