面向对象设计模式学习---Singleton模式(创建型)

从目的方面而言,设计模式有三种分类。

1、创建型模式:负责对象的创建

2、结构型模式:处理类与对象间的组合

3、行为型模式:类与对象交互中的职责分配

在软件系统中,为保证某些类在系统中只存在一个(或者几个)实例,才能保证他们的逻辑正确性以及良好的效率。这就是Singleton设计模式的动机

在过去的系统中,为保证某些类的单一实例,通常是在使用类的过程中再进行判断等操作。然而,这违背了设计的原则,毕竟单一性的问题应该在类设计的时候就考虑进来的,而不是在使用过程中后知后觉的去进行代码层次的修改。换句话说,这种问题的产生式设计者的责任,而不是使用者的责任。

Singleton设计思想:屏蔽公有的构造函数,使得程序编写者无法任意实例化对象,并提供一个公有属性,在属性中只返回单一实例对象。

Singleton模式要点:

      1、构造函数可以设置成Protected类型以供子类派生;

      2、不要支持ICloneable接口,以防止深度Clone出另一个对象

      3、不要支持序列化,以防止将对象序列化成硬盘文件后反序列化生成另一个对象

当线程Singleton模式示例代码

然而在多线程系统中实现Singleton必须考虑到并发性,有可能在判断instance实例判断后实例出多个对象,所以在多线程下需要对模式进行修改

多线程Singleton模式示例

在多线程的类示例代码中,加入一个object类型的资源用于锁定,另外在实例instance变量使用volatile关键字。volatile 关键字指示一个字段可以由多个同时执行的线程修改。声明为 volatile 的字段不受编译器优化(假定由单个线程访问)的限制。这样可以确保该字段在任何时间呈现的都是最新的值。

public class Singleton
{
  
public static readonly Singleton Instance=new Singleton();
 
  
private Singleton(){}
}

在定义静态实例的时候直接初始化,则编译器始终会在定义之后调用默认的静态构造函数,保证了实例唯一性。

补充,在以上示例中均存在构造函数无法传参问题,单线程情况下可将类中的公有属性改变成公有方法,改用方法接受参数的方式返回实例;多线程情况下,如果在定义静态变量的情况下,无法让自动调用的静态构造函数带有参数,故可以在类中添加属性,并在实例化后,对属性赋值方式实现。

posted @ 2009-06-12 11:49  部落酋长  阅读(270)  评论(0编辑  收藏  举报