zoukankan      html  css  js  c++  java
  • 设计模式-单键(Singleton)

    【摘要】
       在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率。

           如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?  

           这应该是类设计者的责任,而不是使用都的责任。

    【全文】

    单键模式(Singleton) 

    动机  

           在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率。

           如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?

           这应该是类设计者的责任,而不是使用都的责任。

    意图

           保证一个类只有一个实例,并提供一个该实例的全局访问点。

    实现思路

           我们常用的方案是对一个单件对象进行惰性初始化,即仅当第一次使用这个对象时才对这个对象进行初始化。

           其实,Singleton模式是设计模式中最简单的一个,因为一个对象的实现化一般是通过new来实现的,而如果我们将构造函数设为私有,那么该对象就不对被“显式”的实例化,然后我们提供一个方法来返回此对象的实例,而在这个方法,我们就大有文章可做了。

    C#例子

    public class SingeltonSimply  

        { 

            private SingeltonSimply() 

            {

            }

            private static SingeltonSimply singelton;


            public static SingeltonSimply Instance  

            {  

                get  

                {  

                    if (singelton == null)  

                    {  

                        singelton = new SingeltonSimply();  

                    }  

                    return singelton;  

                }

            }

        }

        public class Client  

        {  

            public static void Main()  

            {  

                SingeltonSimply Instance = SingeltonSimply.Instance;

            }  

        }

    Java例子

    package pattendesign;

    public class Singelton  

    {  

        private static Singelton Instance = null;  

        private Singelton()  

        {  

        }  

        public static synchronized Singelton GetInstance()  

        {  

            if(Instance==null)

            {

                Instance = new Singelton();  

            }

            return Instance;  

        }  

    }

      

    package pattendesign; 

     

    public class Client  

    {  

        public Client()  

        {  

        }

        public static void main(String[] args)  

        {  

            Singelton singelton = Singelton.GetInstance();  

        }  

    }

    备注

    1、其实JavaC#的代码实现基本一致,只是java不支持属性,所以用一个方法来获得实例;
      

    2、以上两个例子均无考虑多线程的情况;

  • 相关阅读:
    Windows系统安装mysql5.7*时mysql服务启动失败的解决方法
    安装MySQL出现 This application requires Visual Studio 2013 x64 Redistributable.Please install the Redistributable then run this installer again
    Fiddler抓包流程
    C#使用NPOI根据模板生成Word文件功能实现
    .NET nhibernate 添加新的表运行报is not mapped的问题
    二进制原码、反码、补码和位运算
    【英语】面试常用语整理
    【检测分割算法整理】
    【Leetcode方法比较】DP/滑窗/前缀和
    【Leetcode】数学系列
  • 原文地址:https://www.cnblogs.com/wayne173/p/3741830.html
Copyright © 2011-2022 走看看