
























模式分类:
从目的来看:
创建型(creational)模式:负责对象创建
结构型(structural)模式:处理类与对象间的组合
行为型(Behavioral)模式:类与对象交互中的职责分配
从范围来看:
类模式处理类与子类的静态关系
对象模式处理对象间的动态关系
单件模式确立的目的是保证类只有一个实例在系统中运行,并提供一个该实例的全局访问点,确保它们的逻辑正确性以及良好的效率
如何确保只有一个实例运行?这是类设计者的责任,而不是使用者的责任
单线程Singleton模式的几个要点:
1.Singleton模式中的实例构造器可以设置为Protected以允许子类派生
2.Singleton模式一般不要支持ICloneable接口,因为这可能导致多个对象的实例,与singleton模式的初衷相违背
3.Singleton模式一般不要支持序列化,因为这也可能导致多个对象实例。序列化可以创建类的实例。
4.singleton模式只考虑到了对象创建的管理,没有考虑对象的销毁。
5.不能应对多线程环境。
单线程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;
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;
}
}
}
经典的singleton模式
class Singleton
{
public static readonly Singleton Instance=new Singleton();
private Singleton(){ }
}
以上代码相当于下面的代码
class Singleton
{
public static readonly Singleton Instance;
static Singleton()
{
Instance=new Singleton();
}
private Singleton(){ }
}
其中 static Singleton()
{
Instance=new Singleton();
}是在编译时由系统调用的,在实例化Instance变量之前调用
readonly的作用是防止用户赋予null值
也可以在构造函数中带参数
在单线程模式中,如下
public class Singleton
{
private static Singleton instance;
private Singleton(int x ,int y)
{
this.x=x;
this.y=y;
}
public static Singleton Instance
{
get
{
if (instance==null)
{
instance = new Singleton(x,y);
}
return instance;
}
}
int x;
int y;
}
如果没有初始化函数,则可以通过将属性剥离的方式实现,具体实现如下:
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;
}
}
}
在调用函数中先创建类的实例,再设置对象属性值。
singleton模式扩展
将一个实例扩展到N个实例,例如对象池的实现
将new构造器的调用转移到其他类中,例如多个类协同工作环境中
理解和扩展singleton模式的和核心是“如何控制用户使用new对一个类的实例构造器的任意调用”
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。