设计模式学习笔记二(Singleton单件模式)

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

基本Code

public class Singleton

{

    private static Singleton instance;

    Private Singleton()

    {

    }

    public static Singleton Instance

    {

        get

        {

            if (instance == null)

            {

                instance = new Instance();

            }

            return instance;

        }

    }

}

带参数的Singleton模式:

public class Singleton

{

    private static Singleton instance;

    int x, y;

     Private Singleton(int i,int j)

     {

         this.x=i;

         this.y=j;

     }

     public static Singleton GetInstance(int i,int j)

     {

              if (instance==null)

              {   

                   instance=new Instance(i,j);

              }

              return instance;

         }

     }

}

 

需要注意的问题

1、  Singleton模式中的实例构造器可以设置为protected以允许子类派生;

2、  Singleton模式中一般不要实现ICloneable接口,因为这有可能导致多个对象实例;

3、  Singleton模式中一般不要支持序列化,因为这也有可能导致多个对象实例;

4、  Singleton模式只考虑了对象创建的管理,没有考虑对象销毁的考虑。就支持垃圾回收的平台和对象开销来讲,我们一般没有必要对其销毁进行执行特殊处理;

5、  不能应对于多线程环境:在多线程环境下,使用Singleton模式仍然有可能得到Singleton类的多个实例。

 

支持多线程的Singleton模式Code

public class Singleton

{

    private static volatile Singleton instance = null;

    private static object lockHelper = new object();

    Private Singleton()

    {

    }

    public static Singleton Instance

    {

        get

         {

            Lock(lockHelper);

             {

                  if (instance==null)

                  {   

                      instance=new Instance();

                  }

              }

             return instance;

         }

    }

}

注:volatile 关键字表示字段可能被多个并发执行线程修改。声明为 volatile 的字段不受编译器优化(假定由单个线程访问)的限制。这样可以确保该字段在任何时间呈现的都是最新的值。

 

另外一种Singleton模式:

public class Singleton

{

    public static readonly Singleton Instance = new Singleton();

    Private Singleton()

    {

    }

}

上面的代码等同于下面的代码:

public class Singleton

{

    public static readonly Singleton Instance

    static Singleton()

    {

         Instance=new Singleton();

     }

    private Singleton()

    {

    }

}

对于参数而言,我们可以先创建对象,然后再给对象中的属性赋值。如果需要处理资源,可以单独写方法来完成资源的初始化。

 

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

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值