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
  • 相关阅读:
    mysql删除重复记录,保存Id最小的一条
    前段时间,接手一个项目使用的是原始的jdbc作为数据库的访问,发布到服务器上在运行了一段时间之后总是会出现无法访问的情况,登录到服务器,查看tomcat日志发现总是报如下的错误。    Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected est
    Mysql 插入中文错误:Incorrect string value: 'xE7xA8x8BxE5xBAx8F...' for column 'course' at row 1
    Data truncation: Out of range value for column 'Quality' at row 1
    tomcat部署时war和war exploded区别
    IDEA 在某个工程下一个module如何使用另一个module中的资源文件(.xml .prop等)
    MyBatis错误:Result Maps collection already contains value for novel.storage.mapper.NovelMapper.BaseResultMap
    compareTo返回值为-1 、 1 、 0 的排序问题
    深入理解JVM+G1+GC.pdf (中文版带书签)
    轻量级微服务架构(下册)(中文版带书签)、原书代码、数据集
  • 原文地址:https://www.cnblogs.com/fengchao/p/196928.html
Copyright © 2011-2022 走看看