zoukankan      html  css  js  c++  java
  • 01Singleton (Creational Pattern)

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

    1.简单的Singleton

     1 //单例设计模式 这种情况不能应对多线程
     2     class Singleton
     3     {
     4         private static Singleton instance;
     5         private Singleton() { }
     6         public static Singleton Instance
     7         {
     8             get
     9             {
    10                 if (Instance == null)
    11                 {
    12                     instance = new Singleton();
    13                 }
    14                 return instance;
    15             }
    16         }
    17     }

    2.应对多线程

     1  //多线程
     2     class ThreadSingleton
     3     {
     4         //不用volatile还是有可能出现多实例的产生
     5         //保证特定实例不会重新排列  //可以写成方法 也可以写成属性
     6         private static volatile ThreadSingleton instance = null;
     7         //辅助器,不参与变化
     8         private static object lockHelper = new object();
     9         private ThreadSingleton() { }
    10         public static ThreadSingleton Instance
    11         {
    12             get
    13             {
    14                 if (instance == null)
    15                 {
    16                     lock (lockHelper)
    17                     {
    18                         if (instance == null)
    19                         {
    20                             instance = new ThreadSingleton();
    21                         }
    22                     }
    23                 }
    24                 return instance;
    25             }
    26         }
    27     }

    3.简单的单例模式

        //另一种经典的 
        //只适用于无参的时候
        class MSDNSingleton
        {
            public static readonly MSDNSingleton Instance = new MSDNSingleton();
            //私有构造器
            private MSDNSingleton { }
        }
    

     解释上边的单例模式

     1     class MSDNSingleton
     2     {
     3         //实现了内联初始化
     4         public static readonly MSDNSingleton Instance; // = new MSDNSingleton();
     5         //静态的构造器  1.执行时间:如果想执行,那么一定是先执行静态构造器(BeforeFieldInit)2.如果不用就不实例化
     6         //3.在多个线程下,只有一个线程执行
     7         static MSDNSingleton()  
     8         {
     9             Instance=new MSDNSingleton();
    10         }        
    11         //私有构造器
    12         private MSDNSingleton() { }
    13         }

    虽然很方便,但是不支持参数化的构造器(静态构造器是不能传参数的,是系统调用的)

    构造器传参数的方法用第一种和第二种,如果第三种也要实现的话,可以设计与构造器进行隔离的方法

     1   //支持参数化构造器的方式
     2     class ParamSingleton
     3     {
     4         private static ParamSingleton instance;
     5         private ParamSingleton(int x, int y)
     6         {
     7             this.x = x;
     8             this.y = y;
     9         }
    10         public static ParamSingleton GetInstance(int x,int y) 
    11         {
    12             if (instance == null)
    13             {
    14                 instance = new ParamSingleton(x, y);
    15             }
    16             else
    17             {
    18                 instance.x = x;
    19                 instance.y = y;
    20             }
    21                 return instance;            
    22         }
    23         int x;
    24         int y;
    25     }
     1 /静态构造函数不支持传参,可以设计与构造器进行隔离的方法
     2     class MSDNParamSingleton
     3     {
     4         public readonly static MSDNParamSingleton Instance = new MSDNParamSingleton();
     5         private MSDNParamSingleton() { }
     6         //与构造器进行隔离
     7         int x;
     8         int y;
     9         public int X
    10         {
    11             get
    12             {
    13                 return this.x;
    14             }
    15             set
    16             {
    17                 this.X = x;
    18             }
    19         }
    20         public int Y
    21         {
    22             get { return y; }
    23             set { value=y;}
    24         }
    25     }

    Singleton模式扩展

    讲一个实例扩展到n个实例,例如对象池的实现

    将new构造器的调用转移到其他类中,例如多个类协同工作环境中,某个局部环境只需要拥有某个类的一个实例。

    理解和扩展Singleton Pattern的核心是"如何控制用户,使用new对一个类的实例构造器的任意调用"。

     

    .NET框架中的Singleton拓展应用  

      MyClass c1 = new MyClass();
      MyClass c2 = new MyClass();
      //
      Type t1 = c1.GetType();
      Type t2 = c2.GetType();

    推荐的好书:
      重构:改善既有代码的设计 Martin Fowler
      敏捷软件开发:原则 模式与实践 RobertC Martin
      面向对象分析与设计 Grady booch
      设计模式:可复用面向对象软件的基础 Gof
      Refactoring to Patterns: joshua Kerievsky

    .NET框架中的Singleton应用
      Type 和HttpContext 是对应用和拓展

     

     

  • 相关阅读:
    MySQL 命令(一)
    HTML5 表单新增元素与属性
    怎样用SQL修改某个字段的部分内容
    百度sitemap.xml
    Dedecms自定义表单后台列表展现方式样式更改
    织梦seo
    织梦DedeCMS自定义表单diy_list.htm
    织梦采集文章
    播放视频插件swfobject.js与Video Html5
    织梦简单的自定义表单字段
  • 原文地址:https://www.cnblogs.com/cheshui/p/2697606.html
Copyright © 2011-2022 走看看