单例模式

1、动机:
       必须保证系统中只有一个实例。是应该类设计者负责,还是使用者来负责呢?应该归属给类的设计者。
如何饶过常规的构造器,提供一种机制来保证一个类只有一个实例。 

精神:如何控制用户使用new对一个实例构造器的任意调用。

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

3、图

4、代码实现
单线程Singleton实现,可以使用参数的。即懒汉式实现方法。

public class Singleton
{
 private static Singleton instance;
 private Singleton {}  //私有的构造器

 //全局访问点
 public static Singleton Instance
 {
  get
  {
   if ( instance == null )
   {
    instance = new Singleton();
   }

   return instance;
  }
 }
}

多线程Singleton实现,只能使用无参的。
public class Singleton
{
 private static volatile Singleton instance=null;//volatile不会进行微调
 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;
  }
 }
}

饿汉式
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 {}  //私有的构造器

}

另外还有登记式,从略。

5、要点
(1). 可以设置成protected
(2). 不要支持ICloneable接口
(3). 不要支持序列化
(4). 只考虑对象创建的管理,没有考虑对象销毁的管理

6、扩展
(1). 可以把1个实例扩展到n个实例,数据库连接对象。
(2). 将new构造器调用转移到其他类中间。
(3). 屏蔽构造器,或者在构造函数进行处理

7、应用
资源管理
回收站属性修改
多语言支持(多例)
序列生成器
发送邮件,有多台服务器(单例)

8、单例模式与多例模式的区别
单例模式使用聚集是保存的其他对象
多例模式保存的自身的实例

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值