Sigleton单件(创建型模式)--面向对象设计模式纵横谈讲座笔记之二

模式分类
 从目的来看:
  -创建型(Creational)模式:负责对象创建。
  -结构型(Structural)模式:处理类与对象间的组合
  -行为型(Behavioral)模式:类与对象交互中职责分配。
 从范围来看:
  -类模式处理类与子类的静态关系。
  -对象模式处理对象间的动态关系。
动机(Motivaion)
  软件系统种,经常有这样一些特殊类,必须保证它们在系统中只能存在一个实例,才能保证它们逻辑的正确性、以及良好的效率。
  如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?
  这应该是类设计者的责任,而不是使用者的责任。
意图(Intent)
  保证一个类仅有一个实例,并提供一个该实例的全局访问点。
                                   -----《设计模式》GoF
结构(Structure)
单线程Singleton模式实现
 public class Singleton
 {
     private static Singleton instance;
     //私有实例构造器,我能够让使用这个类的客户不能使用这个构造器
     private Singleton(){}
     //静态实例属性
     private static Singleton Instance
     {
        get
 {
    if(instance==null)
    {
       instance=new Singleton();
    }
    return instance;
 }
     }
 }
 单线程Singleton模式的几个要点
   -Singleton模式中的实例构造器可以设置为protected以允许子类派生。
   -Signleton模式一般不要支持ICloneable接口,因为这可能会导致多个对象实例,与Singleton模式的初衷违背。
   -Singleton模式一般不要支持序列化,因为这也有可能导致多个对象实例,同样与Singleton模式的初衷违背。
   -Singleton模式只考虑到了对象创建的管理,没有考虑对象销毁的管理。就支持垃圾回收的平台和对象的开销来讲,我们一般没有必要对其销毁进行特殊的管理。
   -不能对应多线程环境:多线程环境下,使用Singleton模式仍然可能得到Singleton累的多个实例对象。
多线程Singleton模式的实现
class Singleton
{
    private static volatile Singleton instance=null;
    private static Object lockHelper = new Object();

    private Singleton(){}

    public static Singleton Instance
    {
       get
       {
          if(instance==null)
   {
      lock(lockHelper)
      {
         if(instance==null)
  {
     instance=new Singleton();
  }
      }
   }
   return instance;
       }
    }
}


使用.NET类型初始化机制实现多线程Singleton模式--不支持参数化构造器
 sealed class Singleton
 {
    public static readonly Singleton Instance = new Singleton();//内敛初始化,即在声明的时候初始化
    private Sigleton(){}
 }

 sealed可以根据需要来决定有无。
 等同于

 sealed class Singleton
 {
    public static readonly Singleton Instance;

    static Singleton()//静态构造器--只在静态字段初始化之前初始化
    {
      Instance = new Singleton();
    }
    private Singleton(){}
 }

Singleton模式带参数的构造器
public class Singleton
{
    int x;
    int y;
    private static Singleton instace;
    private Singleton(int x,int y)
    {
       this.x=x;
       this.y=y;
    }

    public static Singleton GetInstance(int x,int y)
    {
       if(instance == null)
       {
        instance = new Singleton(x,y)
       }
       else//这个条件可以保障在下面的例子里面的第二个初始化语句里面有用
       {
         instance.x=x;
       }
       return instance;
    }
}
class Test
{
    Singleton t1=Singleton.GetInstance(100,200);
    Singleton t2=Singleton.GetInstance(200,300);//第二个已经没有用了,如果没有里面的那个else语句
}

下面的代码弥补了使用.NET类型初始化机制实现多线程Singleton模式--不支持参数化构造器的情况,利用属性。
 sealed class Singleton
 {
    int x;
    int y;

    public int X
    {
      get
      {
        return this.x;
      }
      set
      {
        this.x = x;
      }
    }

    public int Y
    {
       get
       {
          return this.y;
       }
       set
       {
          this.y = y;
       }
    }
    public static readonly Singleton Instance = new Singleton();//内敛初始化,即在声明的时候初始化
    private Sigleton(){}
 }

   上面涉及了部分Singleton扩展,当然还有很多其他的扩展,我们了解模式的了解,应该是灵活的。
 Singleton模式扩展
   -将一个实例扩展到n个实例,例如对象池的实现。
   -将new构造器的调用转移到其他类中,例如多个类协同工作环境种,某个局部环境只需要拥有某一个类的实例。
   -理解和扩展Singleton模式的核心是“如何控制用户使用new对一个类实例构造器的任意调用”。
.NET框架中的Singleton应用(扩展应用)
   Type
   HttpContext.Current(框架1.1)
  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值