一:模式分类

从目的来看:

创建型(Creational)模式:负责对象创建。

结构型(Structural)模式:处理类与对象间的组合。

行为型(Behavioral)模式:类与对象交互中的职责分配。

从范围来看:

类模式处理类与子类的静态关系。

对象模式处理对象间的动态关系。

二:Singleton (创建型模式) 单件

1.动机(Motivation)

软件系统中,经常有这样一些特殊的类,必须保证他们在系统中只存在一个实例,才能确保它们的逻辑正确性,以及良好的效率。

如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例 ?

这应该是类设计者的责任,而不是使用者的责任。

2.意图(Intent)

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

3.结构(Structure)

三:实现

1.单线程Singleton模式实现

1.2单线程Singleton几个要点:

Singleton模式中的实例构造器可以设置为protected以允许子类派生。

Singleton模式一般不要支持Icloneable接口,因为这可能导致多个实例对象,与Singleton模式初衷违背。

Singleton模式一般不要支持序列化,因为这可能导致多个实例对象,与Singleton模式初衷违背。

Singleton模式只考虑对象创建的管理,没有考虑对象销毁的管理,就支持垃圾回收的平台和对象的开销来讲,我们没有必要对其销毁进行管理特殊管理。

不能应对多线程情况,在多线程环境下仍有可能出现多个对象实例。

 public class MySigleton_SingleProcess
{
private static MySigleton_SingleProcess instance; private MySigleton_SingleProcess() { } public static MySigleton_SingleProcess GetMySingletonInstance()
{
if(instance==null){
instance = new MySigleton_SingleProcess();
}
return instance;
}
}

  

2.多线程Singleton模式实现

    public class MySigleton_MultiProcess
{
private static MySigleton_MultiProcess instance; private static readonly object lockHelper=new object(); private MySigleton_MultiProcess() { } public static MySigleton_MultiProcess GetMySingletonInstance()
{
if (instance == null)
{
lock (lockHelper)
{
//double check 预防代码编译的时候作出优化调整了代码执行顺序
if (instance == null)
{
instance = new MySigleton_MultiProcess();
}
} }
return instance;
}
}

3.使用.NET初始化机制实现多线程Singleton模式

  public  class Singleton
{
private static readonly Singleton _instance = new Singleton(); // Explicit static constructor to tell C# compiler
// not to mark type as beforefieldinit
static Singleton()
{
} /// <summary>
/// Prevents a default instance of the
/// <see cref="Singleton"/> class from being created.
/// </summary>
private Singleton()
{
} /// <summary>
/// Gets the instance.
/// </summary>
public static Singleton Instance
{
get
{
return _instance;
}
}
}

4.Singleton 模式扩展

将一个实例扩展到多个实例,比如对象池的实现。

将New构造器的调用转移到其他类中,例如多个类协同工作环境中,某个局部环境只需要拥有某个类的一个实例。

Singleton 模式核心是“如何控制用户使用new对一个类的实例构造器的任意调用”。

5. .NET框架中Singleton模式的应用

Object 基类中的 GetType() 。

C#面向对象设计模式纵横谈——2.Singleton 单件(创建型模式)的更多相关文章

  1. php设计模式(一):简介及创建型模式

    我们分三篇文章来总结一下设计模式在PHP中的应用,这是第一篇创建型模式. 一.设计模式简介 首先我们来认识一下什么是设计模式: 设计模式是一套被反复使用.容易被他人理解的.可靠的代码设计经验的总结. ...

  2. 面向对象设计模式纵横谈:Singelton单件模式(笔记记录)

       李建忠老师讲的<面向对象设计模式纵横谈>,早就看过了,现在有了时间重新整理一下,以前的博客[赛迪网]没有了,现在搬到博客园,重新过一遍,也便于以后浏览. 设计模式从不同的角度分类会得 ...

  3. Singleton patterns 单件(创建型模式)

    1.模式分类 1.1  从目的来看: •      – 创建型(Creational)模式:负责对象创建. •      – 结构型(Structural)模式:处理类与对象间的组合. •      ...

  4. .NET设计模式(7):创建型模式专题总结(Creational Pattern)(转)

    概述 创建型模式,就是用来创建对象的模式,抽象了实例化的过程.它帮助一个系统独立于如何创建.组合和表示它的那些对象.本文对五种常用创建型模式进行了比较,通过一个游戏开发场景的例子来说该如何使用创建型模 ...

  5. .NET设计模式(7):创建型模式专题总结(Creational Pattern)

    ):创建型模式专题总结(Creational Pattern)    创建型模式专题总结(Creational Pattern) --.NET设计模式系列之七 Terrylee,2006年1月 转载: ...

  6. 设计模式(Java版)-创建型模式之简单工厂模式

    前言:这段时间在学习设计模式,本人也是小菜一枚(所以写的如果有错误的地方请大大们给予指出).这个东西也是我一直想学习的,从点点滴滴做起,记录下自己每天的领悟! 一.工厂模式的动机 在软件系统中,经常面 ...

  7. C#面向对象设计模式纵横谈——5.Factory Method 工厂方法模式(创建型模式)

    动机 (Motivation) 在软件系统中,经常面临着“某个对象”的创建工作; 由于需求的变化,这个对象经常面临着剧烈的变化,但是它却拥有比较稳定的接口. 如何应对这种变化?如何提供一种“封装机制” ...

  8. 面向对象设计模式纵横谈:Abstract Factory 抽象工厂模式(笔记记录)

         今天是设计模式的第二讲,抽象工厂的设计模式,我们还是延续老办法,一步一步的.演变的来讲,先来看看一个对象创建的问题. 1.如何创建一个对象 常规的对象创建方法: 这样的创建对象没有任何问题, ...

  9. 面向对象设计模式纵横谈:Factory Method 工厂方法模式(笔记记录)

    从耦合关系谈起 耦合关系直接决定着软件面对变化时的行为 -模块与模块之间的紧耦合使得软件面对变化时,相关模块都要随之更改 -模块与模块之间的松耦合使得软件面对变化时,一些模块更容易被替换或者更改,但其 ...

随机推荐

  1. chunkupload文件上传断点续传组件(java)

    chunkupload简介 chunkupload是一款基于java语言的断点续传组件,针对文件上传,非文件下载,集成方便,使用简单. 从整体上讲,chunkupload会对文件进行切片处理,每个切片 ...

  2. php实现设计模式之代理模式

    <?php /* * 代理模式 * 为其他对象提供一种代理以控制对这个对象的访问. * 在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用 ...

  3. nodejs 安装

    安装nodejs进入nodejs源码./configure --prefix=/software/installed/nodemakemake install 如果configure的时候提示:WAR ...

  4. Java面试题整理二(侧重SSH框架)

    1.持久化对象的状态都有哪些? 答:瞬时对象(Transient Objects):使用new 操作符初始化的对象不是立刻就持久的.它们的状态是瞬时的,也就是说它们没有任何跟数据库表相关联的行为,只要 ...

  5. RPC原来就是Socket——RPC框架到dubbo的服务动态注册,服务路由,负载均衡演化

    序:RPC就是使用socket告诉服务端我要调你的哪一个类的哪一个方法然后获得处理的结果.服务注册和路由就是借助第三方存储介质存储服务信息让服务消费者调用.然我们自己动手从0开始写一个rpc功能以及实 ...

  6. 兼容javascript和C#的RSA加密解密算法,对web提交的数据进行加密传输

    Web应用中往往涉及到敏感的数据,由于HTTP协议以明文的形式与服务器进行交互,因此可以通过截获请求的数据包进行分析来盗取有用的信息.虽然https可以对传输的数据进行加密,但是必须要申请证书(一般都 ...

  7. OC多态

    要点: 1.多种形态,引用的多种形态对于一个引用变量,可以指向任何类的对象.对于一个父类的引用(类与类之间有一种继承关系),可以指向子类,也可以指向本类,指向的类型不同.当通过此引用向对象发送消息,调 ...

  8. android 自定义控件——(五)按钮点击变色

    ----------------------------------按钮点击变色(源代码下有属性解释)------------------------------------------------- ...

  9. 跳转时候提示Attempt to present on while a presentation is in progress

    出现这种情况,例如:我在获取相册图片后,直接present到另一个页面,但是上一个页面可能还未dismiss,所以,要在获取相册图片的dismiss方法的complete的block里面写获取图片及跳 ...

  10. jQuery 上传头像插件Jcrop的实例

    兼容:ie6+,FF,chrome等 示例图: CSS:     说明:图像比例为110:135     下载包里有 jquery.Jcrop.css          .jc-demo-box{po ...