设计模式笔记 1.Singleton 单例模式(创建型模式)
2008-07-18 22:19
337 查看
1. Singleton [/b]单单例模式[/b]([/b]创建型模式[/b]) [/b]
模式分类[/b][/b]
从目的来看:
创建型(Creational)模式:将对象的部分创建工作延迟到子类或者其他对象,从而应对需求变化为对象创建时具体类型实现引来的冲击。
结构型(Structural)模式:通过类继承或者对象组合获得更灵活的结构,从而应对需求变化为对象的结构带来的冲击。
行为型(Behavioral)模式:通过类继承或者对象组合来划分类与对象间的职责,从而应对需求变化为多个交互的对象带来的冲击。
从范围来看:
类模式处理类与子类的静态关系;对象模式处理对象间的动态关系。
动机[/b](Motivation)[/b]
在软件系统中,经常面临着创建对象的工作;由于需求的变化,需要创建的对象的具体类型经常变化。
如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种“封装机制”来避免客户程序和这种“具体对象创建工作”的紧耦合?
意图([/b]Intent[/b])[/b][/b]
单例模式保证应用只有一个全局唯一的实例,并且提供一个访问它的全局访问点。
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟到子类。 ——《设计模式》 GoF
单线程的实现:
class Singleton
{
//单线程时的单例模式
private static Singleton instance;
//构造方法让其private,这就堵死了外界利用new创建此类实例的可能
private Singleton()
{
}
public static Singleton GetInstance()//此方法是获得本类实例的唯一全局访问点
{
if (instance == null)//若实例不存在,则new一个新实例,否则返回已有的实例
{
instance = new Singleton();
}
return instance;
}
}
客户端代码:
static void Main(string[] args)
{
Singleton s1 = Singleton.GetInstance();
Singleton s2 = Singleton.GetInstance();
if (s1 == s2)
{
Console.WriteLine("Objects are the same instance");
}
Console.ReadLine();
}
多线程的实现:
class Singleton
{
//多线程时的单例模式
private static Singleton instance;
private static readonly object syncRoot = new object();
//程序运行时创建一个静态只读的进程辅助对象
private Singleton()
{
}
public static Singleton GetInstance()
{
if (instance == null)
//先判断实例是否存在,不存在再加锁处理,可以提高性能(双重锁定)
{
lock (syncRoot)//在同一个时刻加了锁的那部分只有一个线程可以进入
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
}
return instance;
}
}
静态初始化:(能够达到同样的效果)
class Singleton
{
//静态初始化
public sealed class Singleton //sealed阻止发生派生,而派生可能会增加实例
{
private static readonly Singleton instance = new Singleton();
//在第一次引用类的任何成员时创建实例,公共语言运行库负责处理变量初始化
private Singleton() { }
public static Singleton GetInstance()
{
return instance;
}
}
}
模式分类[/b][/b]
从目的来看:
创建型(Creational)模式:将对象的部分创建工作延迟到子类或者其他对象,从而应对需求变化为对象创建时具体类型实现引来的冲击。
结构型(Structural)模式:通过类继承或者对象组合获得更灵活的结构,从而应对需求变化为对象的结构带来的冲击。
行为型(Behavioral)模式:通过类继承或者对象组合来划分类与对象间的职责,从而应对需求变化为多个交互的对象带来的冲击。
从范围来看:
类模式处理类与子类的静态关系;对象模式处理对象间的动态关系。
动机[/b](Motivation)[/b]
在软件系统中,经常面临着创建对象的工作;由于需求的变化,需要创建的对象的具体类型经常变化。
如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种“封装机制”来避免客户程序和这种“具体对象创建工作”的紧耦合?
意图([/b]Intent[/b])[/b][/b]
单例模式保证应用只有一个全局唯一的实例,并且提供一个访问它的全局访问点。
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟到子类。 ——《设计模式》 GoF
单线程的实现:
class Singleton
{
//单线程时的单例模式
private static Singleton instance;
//构造方法让其private,这就堵死了外界利用new创建此类实例的可能
private Singleton()
{
}
public static Singleton GetInstance()//此方法是获得本类实例的唯一全局访问点
{
if (instance == null)//若实例不存在,则new一个新实例,否则返回已有的实例
{
instance = new Singleton();
}
return instance;
}
}
客户端代码:
static void Main(string[] args)
{
Singleton s1 = Singleton.GetInstance();
Singleton s2 = Singleton.GetInstance();
if (s1 == s2)
{
Console.WriteLine("Objects are the same instance");
}
Console.ReadLine();
}
多线程的实现:
class Singleton
{
//多线程时的单例模式
private static Singleton instance;
private static readonly object syncRoot = new object();
//程序运行时创建一个静态只读的进程辅助对象
private Singleton()
{
}
public static Singleton GetInstance()
{
if (instance == null)
//先判断实例是否存在,不存在再加锁处理,可以提高性能(双重锁定)
{
lock (syncRoot)//在同一个时刻加了锁的那部分只有一个线程可以进入
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
}
return instance;
}
}
静态初始化:(能够达到同样的效果)
class Singleton
{
//静态初始化
public sealed class Singleton //sealed阻止发生派生,而派生可能会增加实例
{
private static readonly Singleton instance = new Singleton();
//在第一次引用类的任何成员时创建实例,公共语言运行库负责处理变量初始化
private Singleton() { }
public static Singleton GetInstance()
{
return instance;
}
}
}
相关文章推荐
- 设计模式笔记 1.Singleton 单例模式(创建型模式)
- 设计模式学习笔记--抽象工厂模式(Abstract Factory Pattern)【创建型模式】
- 学习Java 23种设计模式详解笔记之创建型模式(一)
- 设计模式学习笔记(五):创建型模式
- 设计模式学习笔记(十四)——创建型模式总结
- 【设计模式学习笔记五】【创建型模式】【原型模式(Prototype)】
- 创建型模式学习总结——设计模式学习笔记
- 设计模式笔记(2)---单件模式(创建型)
- 设计模式笔记(3)---抽象工厂模式(创建型)
- 设计模式笔记(4)---生成器模式(创建型)
- 设计模式(2)-创建型-工厂方法(Factory method)(个人笔记)
- 设计模式学习笔记一(创建型)
- [设计模式笔记]快速小结(一)---对象创建型模式
- 【设计模式学习笔记六】【创建型模式】【建造者模式(Builder)】
- 设计模式笔记(3)---抽象工厂模式(创建型)
- C#面向对象设计模式纵横谈(2):Singleton 单件(创建型模式) 笔记
- C#面向对象设计模式学习笔记(3) - Builder 生成器模式(创建型模式)
- 设计模式(3)-创建型-抽象工厂(Abstract Factory)(个人笔记)
- 设计模式复习笔记 (2)创建型模式:简单工厂模式
- 设计模式学习笔记(十四)——创建型模式总结