**
模式分类
**
从目的来看
- 创建型模式:负责对象创建。
- 结果型模式:处理类与对象间的组合
- 行为型模式:类与对象交互中职责分配
从范围来看
-
类模式处理类与子类的静态关系。对象模式处理对象间的动态关系。
类模式处理类与子类的静态关系.对象模式处理对象间的动态关系. -
类模式处理类与子类的静态关系。对象模式处理对象间的动态关系。
类模式处理类与子类的静态关系.对象模式处理对象间的动态关系.
动机 -
在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率。
-
如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?
-
这应该是类设计者的责任,而不是使用者的责任。
意图
- 保证一个类仅有一个实例,并提供一个该实例的全局访问点。
单线程Singleton模式
/// <summary>
/// 单线程Singleton模式
/// </summary>
public class Singleton
{
private static Singleton instance;
//防止随便new
private Singleton() { }
//创建一个只读属性。为了每次请求都返回第一个实例。
public static Singleton Instance {
get {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
}
单线程Singleton模式几个要点
- Singleton模式中的实例构造器可以设置为protected以允许子类派生。
- Singleton模式一般不要支持ICloneable接口,因为这可能会导致多个对象实例,与Singleton模式的初衷违背。
- Singleton模式一般不要支持序列化,因为这也有可能导致多个对象实例,同样与Singleton模式的初衷违背。
- Singletom模式只考虑到了对象创建的管理,没有考虑对象销毁的管理。就支持垃圾回收的平台和对象的开销来讲,我们一般没有必要对其销毁进行特殊的管理。
- 不能应对多线程环境:在多线程环境下,使用Singleton模式仍然有可能得到Singleton类的多个实例对象。
多线程Singleton模式
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Singleton单件创建型模式
{/// <summary>
/// 多线程Singleton模式
/// </summary>
public class Singleton1
{
//volatile防止编译器对代码进行微调
private static volatile Singleton1 instance;
private static object lockHelper = new object();
//防止随便new
private Singleton1() { }
//创建一个只读属性。为了每次请求都返回第一个实例。
public static Singleton1 Instance
{
get
{
if (instance == null)
{
//线程锁
lock (lockHelper)
{
if (instance == null) {
instance = new Singleton1();
}
}
}
return instance;
}
}
}
}
带参数的
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Singleton单件创建型模式
{/// <summary>
/// 多线程Singleton模式,带参数的
/// </summary>
public class Singleton1
{
//volatile防止编译器对代码进行微调
private static volatile Singleton1 instance;
private static object lockHelper = new object();
int x;
int y;
//防止随便new
private Singleton1(int x,int y) {
this.x = x;
this.y = y;
}
//创建一个只读属性。为了每次请求都返回第一个实例。
public static Singleton1 Instance(int x,int y)
{
if (instance == null)
{
//线程锁
lock (lockHelper)
{
if (instance == null) {
instance = new Singleton1(x,y);
}
}
}
return instance;
}
}
}