Singleton 单例模式(创建型模式)

动机(Motivation)
当进行软件开发是会有这样一种需求:在系统中只有存在一个实例才能确保它们的逻辑正确性、以及良好的效率。
这应该是类设计者的责任,而不是使用者的责任。

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

单线程Singleton模型实现:

 pulic class Singleton
{
private static Singleton instance;//如果客户不需要这个实例最好不要new一个实例,不要在这里new private Singleton(){}//如果不写的话,将会是public的构造器,public是可以随便new的 public static Singleton Instance
{
get
{
if(instance==null)
{
instance=new Singleton();
}
return instance;
}
}
}

调用:Singleton instance = Singleton.Instance;

单线程Singleton模式的几个要点:
Singleton模式总的实例构造器可以设置为protected以允许子类派生。
Single模式一般不要支持IColoneable接口,因为这可能导致多个对象实例,同样与Singleton模式的初衷违背。
Single模式只考虑到了对象创建的管理,没有考虑对象销毁的管理。就支持垃圾回收的平台和对象的开销来讲,我们没有必要对其销毁进行特殊的处理。

多线程Singleton模型实现:

 class Singleton
{
private static volatile Singleton instance=null;//编译代码的时候编译器会对代码微调,为了禁止微调所以要加volatile
private static object lockHelper=new object();
private Singleton(){}
public sttic Singleton Instance
{
get
{
if(instance==null)
{
lock(lockHelper)
{
if(instance==null)
{
instance=new Singleton();
}
}
}
return instance;
}
}
}

.NET自带的单例实现:

 class Singleton
{
public static readonly Singleton Instance = new Singleton();//内联初始化
private Singleton(){}
}

等同于:

 class Singleton
{
public static readonly Singleton Instance;//Instance在被访问之前会先走静态构造器
static Singleton()//静态构造器,.net类型初始化机制可以保证只有一个线程执行。静态构造器不能传递参数,它是给系统来调用的。
{
Instance=new Singleton();
}
private Singleton(){}
}

弊端:
不支持参数化
以单线程Singleton模型实现为例,就可以支撑参数化:

 pulic class Singleton
{
private static Singleton instance; private Singleton(int x,int y)
{
this.x=x;
this.y=y;
} public static Singleton GetInstance(int x,int y)
{
if(instance==null)
{
instance=new Singleton(x,y);
}
else
{
instance.x=x;
instance.y=y;
}
return instance;
} int x;
int y;
}

调用:
Singleton t1=Singleton.GetInstance(100,200);
Singleton t2=Singleton.GetInstance(200,300);

其实可以用设置属性的方法也可以这实现:

 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;
}
}
int x;
int y; /*也可以添加初始化函数(也可以带参数),来和构造器进行剥离
public void Init()
{
...
}
*/
}

Singleton模式扩展
将一个实例扩展到n个实例,例如对象池的实现。
将new构造器的调用转移到其他类中,例如多个类协同工作环境中,某个局部环境只需要拥有某个类的一个实例。
理解和扩展Singleton模式的核心是“如何控制用户使用new对一个类的实例构造器的任意调用”。

最近在看李建忠老师的 《C#面向对象设计模式纵横谈》,虽然是很多年前的视频,还是很受启发,就决定把笔记整理一遍。

设计模式01: Singleton 单例模式(创建型模式)的更多相关文章

  1. C#面向对象设计模式纵横谈——2.Singleton 单件(创建型模式)

    一:模式分类 从目的来看: 创建型(Creational)模式:负责对象创建. 结构型(Structural)模式:处理类与对象间的组合. 行为型(Behavioral)模式:类与对象交互中的职责分配 ...

  2. 单例模式——创建型模式01

    1. 名称     单例模式(Singleton Pattern):确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类.单例模式是一种对象创建型模式. 2. 问题    ...

  3. java架构之路-(设计模式)五种创建型模式之单例模式

    设计模式自身一直不是很了解,但其实我们时刻都在使用这些设计模式的,java有23种设计模式和6大原则. 设计模式是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可 ...

  4. Java设计模式(4)——创建型模式之单例模式(Singleton)

    一.概述 弥补一下之前没有给设计模式下的定义,先介绍一下设计模式(引用自百度百科): 设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类的.代码设计经验的总结. 使用设计 ...

  5. Sington单例模式(创建型模式)

    一.使用Sington单例模式的动机(Motivation) 在软件系统中,经常有一些特殊的类,必须保证它们只有一个实例,才能保证它的逻辑正确性.以及良好的效率. 大多数类用的是常规的构造器,所以往往 ...

  6. 设计模式-单例模式(Singleton) (创建型模式)

    //以下代码来源: 设计模式精解-GoF 23种设计模式解析附C++实现源码 //Singleton.h #pragma once #include<iostream> class Sin ...

  7. [C#]设计模式-单例模式-创建型模式

    单例模式用于在整个软件系统当中保持唯一实例,在 C# 当中最能够体现此概念的就是静态类,静态类的生命周期是跟随整个程序,并且在整个程序中仅保有一个实例. 不过在这里我们不再详细阐述单例模式与静态类有什 ...

  8. Java设计模式(1)——创建型模式之简单工厂模式(Simple Factory)

    设计模式系列参考: http://www.cnblogs.com/Coda/p/4279688.html 一.概述 工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高 ...

  9. Java设计模式(5)——创建型模式之建造者模式(Builder)

    一.概述 概念 将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示.(与工厂类不同的是它用于创建复合对象) UML图   主要角色 抽象建造者(Builder)——规范建造方法与结果 ...

  10. Java设计模式(3)——创建型模式之抽象工厂模式(Abstract Factory)

    一.概述 抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式.抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象. UML图: 其他的过多概念不再 ...

随机推荐

  1. maven搭建

    http://blog.csdn.net/zhshulin/article/details/30779873 http://blog.csdn.net/zhshulin/article/details ...

  2. his移植问题

    报错信息 权限不够未截图 注意修改uploads文件权限chmod 777 uploads 修改域名 参照dxtzy项目,sourcetree备注

  3. ADO连接ACCESS数据库

    首先在StdAfx.h中加入 建立连接:(在xxApp文件中) 1  声明变量 2 建立连接 (1) AfxOleInit 初始化 OLE 为应用程序的支持. BOOL AFXAPI AfxOleIn ...

  4. 【转】用Jmeter进行接口压力测试的步骤

    1.双击jmeter.bat 2.右键点击测试规划à添加àThreadsà线程组,此时在测试规划下边显露出来线程组选项.点击该选项,显露出来线程组界面.参变量线程数表达若干个烦请,参变量Ramp-Up ...

  5. CP干货:手机游戏上线前需要准备什么

    转自:http://www.gamelook.com.cn/2015/09/229002 游戏研发完成后游戏该怎样推广?如何找渠道?推广时需要注意什么?下面给大家介绍一下具体流程,可能每个公司的上线流 ...

  6. Three.js响应和移动物体

    效果图 demo import './index.css'; // stats var stats; (function(){ stats = new Stats(); document.body.a ...

  7. C#应用调试C++ dll的方法

    最近碰到个C#应用闪退的问题,由于通讯部分调用了C++工程写的dll,下面介绍一种调试的方法. 右键 启动项目,分别配置常规和和调试即可,如下图. 常规中,输出目录设置为安装目录中dll对应的目录: ...

  8. jdk环境变量一键设置 管理員运行

    退出360等杀毒软件 本机win10 其他环境自测.参考了网上代码修改. @echo off rem dss color 02 mode con cols=70 lines=30 title JDK ...

  9. DAY.15_Python

    昨天完成了三级菜单和购物车程序的作业: """ .__author__.=,"JerseyHg" 作业要求:1. 可依次选择进入到下一级菜单:2. 可 ...

  10. Perl基础语法

    一.脚本文件perl 代码可以写在一个文本文件中,以 .pl..PL 作为后缀.文件名可以包含数字,符号和字母,但不能包含空格,可以使用下划线(_)来替代空格.一个简单的Perl 文件名:rurun_ ...