Singleton 单例模式(创建型模式)

动机(Motivation)
当进行软件开发是会有这样一种需求:在系统中只有存在一个实例才能确保它们的逻辑正确性、以及良好的效率。
这应该是类设计者的责任,而不是使用者的责任。

意图(Intent)
保证一个类仅有一个实例,并提供一个该实例的全局访问点。——《设计模式》GoF

单线程Singleton模型实现:

 pulic class Singleton
{
private static Singleton instance;//如果客户不需要这个实例最好不要new一个实例,不要在这里new private Singleton(){}//如果不写的话,将会是public的构造器,public是可以随便new的 public static Singleton Instance
{
get
{
if(instance==null)
{
instance=new Singleton();
}
return instance;
}
}
}

调用:Singleton instance = Singleton.Instance;

单线程Singleton模式的几个要点:
Singleton模式总的实例构造器可以设置为protected以允许子类派生。
Single模式一般不要支持IColoneable接口,因为这可能导致多个对象实例,同样与Singleton模式的初衷违背。
Single模式只考虑到了对象创建的管理,没有考虑对象销毁的管理。就支持垃圾回收的平台和对象的开销来讲,我们没有必要对其销毁进行特殊的处理。

多线程Singleton模型实现:

 class Singleton
{
private static volatile Singleton instance=null;//编译代码的时候编译器会对代码微调,为了禁止微调所以要加volatile
private static object lockHelper=new object();
private Singleton(){}
public sttic Singleton Instance
{
get
{
if(instance==null)
{
lock(lockHelper)
{
if(instance==null)
{
instance=new Singleton();
}
}
}
return instance;
}
}
}

.NET自带的单例实现:

 class Singleton
{
public static readonly Singleton Instance = new Singleton();//内联初始化
private Singleton(){}
}

等同于:

 class Singleton
{
public static readonly Singleton Instance;//Instance在被访问之前会先走静态构造器
static Singleton()//静态构造器,.net类型初始化机制可以保证只有一个线程执行。静态构造器不能传递参数,它是给系统来调用的。
{
Instance=new Singleton();
}
private Singleton(){}
}

弊端:
不支持参数化
以单线程Singleton模型实现为例,就可以支撑参数化:

 pulic class Singleton
{
private static Singleton instance; 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;
instance.y=y;
}
return instance;
} int x;
int y;
}

调用:
Singleton t1=Singleton.GetInstance(100,200);
Singleton t2=Singleton.GetInstance(200,300);

其实可以用设置属性的方法也可以这实现:

 class Singleton
{
public static readonly Singleton Instance = new Singleton();//内联初始化
private Singleton(){} public int x
{
get{
return this.x;
}
set{
this.x=x;
}
}
public int y
{
get{
return this.y;
}
set{
this.y=y;
}
}
int x;
int y; /*也可以添加初始化函数(也可以带参数),来和构造器进行剥离
public void Init()
{
...
}
*/
}

Singleton模式扩展
将一个实例扩展到n个实例,例如对象池的实现。
将new构造器的调用转移到其他类中,例如多个类协同工作环境中,某个局部环境只需要拥有某个类的一个实例。
理解和扩展Singleton模式的核心是“如何控制用户使用new对一个类的实例构造器的任意调用”。

最近在看李建忠老师的 《C#面向对象设计模式纵横谈》,虽然是很多年前的视频,还是很受启发,就决定把笔记整理一遍。

最新文章

  1. Leetcode: Valid Word Square
  2. 用Paint Tool SAI绘制漫画
  3. easyui DataGrid 工具类之 TableUtil class
  4. scikit-learn——快速入门
  5. [UI]Flat UI - Free Boorstrap Framework and Theme
  6. Git常用命令大全
  7. 【 D3.js 高级系列 — 5.0 】 颜色
  8. #include <locale.h> #include <locale>
  9. GridView的RowDataBound事件中获取当前行内容的几种方法
  10. 九度OJ:1002-Grading
  11. (转载)iptables 转发oracle端口
  12. poj 3761 bubble sort (排列组合)
  13. 61、web框架
  14. socket端口绑定后通过bat干掉
  15. Python高级技巧:用一行代码减少一半内存占用
  16. Javascript - 表达式与语句
  17. ARM入门最好的文章
  18. day 59 pymysql
  19. 【WCF】HTTP 无法注册 URL 进程,不具有此命名空间的访问权限
  20. LeetCode: Combinations 解题报告

热门文章

  1. bzoj 3779 重组病毒 —— LCT+树状数组(区间修改+区间查询)
  2. Java 程序员容易犯的10个SQL错误
  3. Linux安装微信
  4. 微信小程序之if操作
  5. python‘s tenth day for me
  6. CSS 透明
  7. 算法初步——two pointers
  8. MFC小程序
  9. rdlc设置指定列隐藏
  10. WebApi 通过身份票据进行认证授权的具体实现