1. Singleton 模式的不同实现形式

1) 最简单的Sigleton (无线程同步, 不适应多线程环境)

using System;

public class Singleton

{

private static Singleton instance;

private Singleton() { }

public static Singleton GetInstance() {

if (instance == null) {

instance = new Singleton();

}

return instance;

}

}

2) 著名的Double check 方式(有同步控制, 可以用于多线程环境)

这种方式实现也不复杂,需要注意的是,在.Net 平台下,由于优化的需要,JIT 编译器有

可能调整语句顺序,因此要使用易失字段(C#使用volatile 关键字)避免这种情况的发生。

using System;

public class Singleton

{

private static volatile Singleton instance;

private static readonly object lockHelper = new object();

private Singleton() { }

public static Singleton GetInstance() {

if (instance == null) {

lock(lockHelper) {

if (instance == null) {

instance = new Singleton();

}

}

}

return instance;

}

}

3) 事实上,.net编译器可能为我们带来麻烦,同时我们也可以利用.net运行时的特点实现更为

简洁的多线程Singleton, 那就是 static 构造器,我们知道,static 构造函数是由.net

runtime 调用的,用户不可直接调用,并且它保证即使在多线程模式下,static 构造函数

也只会被执行一次,也可以这么说,.net 运行时免费为我们加了锁,那么我们就可以利用这个

特点,来实现更为简洁的Singleton (当然也适应多线程环境), 实现如下:

using System;

public class Singleton

{

private static Singleton instance;

static Singleton() {

instance = new Singleton();

}

private Singleton() { }

public static Singleton GetInstance() {

return instance;

}

}

如果我们更加的崇尚简洁,则可以使用内联的方式来初始化instance, 实现如下:

using System;

public class Singleton

{

private static Singleton instance  = new Singleton();

private Singleton() { }

public static Singleton GetInstance() {

return instance;

}

}

当然,更为简洁的做法是:

using System;

public class Singleton

{

public static readonly Singleton Instance  = new Singleton();

private Singleton() { }

}

Singleton 模式的主要优点:

1). 适用于任何类.

2). 可以通过派生创建,无论基类是否为Singleton, 子类都可以实现为Singleton。

3). Lazy loading: 如果从来没有使用过一个Singleton 类, 它就不会占用内存。

Sigleton 模式的代价:

1). 销毁方法没有定义:Singleton 一旦被加载,将一直存在于内存,直到应用程序卸载,无法销毁,

即使将其设置为null, 系统的各个对象仍然可能拥有它的引用,再次调用时,将再次产生一个实

例,如果在C++ 这个的系统中,这样的操作还有可能导致系统的崩溃。

2). 效率问题:每次调用都要执行if 语句,而大部分情况下是多余的,不过这个问题只在第一种方式实现的

Singleton 模式中存在。

3). Singleton 的子类天然不是Singleton, 必须重新实现。

4). 丧失多态性。

5). 不透明性:客户程序必须知道它正在使用一个Singleton, 因为必须使用GetInstance() 才能创建

实例。

2. MonoState 的实现及其与Singleton 的比较

Monostate是另一种获得“系统某个类别对象都表现为一个对象”的实现方式,Singleton模式重在

通过保证系统中只有唯一实例,而Monostate模式重在保证唯一状态, 当然Singleton模式更多的是用来

保证唯一实例。

Monostate模式更多关注的是行为,即行为上的一致;Singleton模式更多关注的是结构,强制结构上的

单一,仅产生唯一实例,下面是MonoState 模式的实现:

using System;

public class Mono

{

private int a;

private int b;

public Mono(int a, int b) {

this.a = a;

this.b = b;

}

public int A {

get {

return this.a;

}

set {

this.a = value;

}

}

public int B {

get {

return this.b;

}

set {

this.b = value;

}

}

}

public class MonoState

{

private static Mono mono;

public MonoState() {

mono = new Mono(10, 20);

}

public Mono Mono {

get {

return mono;

}

set {

mono = value;

}

}

}

internal static class TestApp

{

private static void Main() {

MonoState monoState1 = new MonoState();

monoState1.Mono.A = 200;

MonoState monoState2 = new MonoState();

monoState2.Mono.B = 400;

Console.WriteLine(object.ReferenceEquals(monoState1.Mono, monoState2.Mono));

}

}

Monostate模式比Singleton模式有着一些优势和特点:

1). 没有到底谁负责销毁的问题,你可以在你不想Monostate对象的时候将它销毁,因为它和任何

其他的对象没有任何区别。

2). MonoState 的子类天然就是MonoState。

3). 可以表现多态性,因为Mono 属(或者实现为两个方法)不是static 的,因此可以override.

4). 透明性:用户并不需要也不关心是否使用了Monostate模式对象,原因还是Monostate对象和其

他对象是一样的。

当然Monostate模式也有自己的限制和代价:

1). 内存占用:即使不使用Monostate对象,也要占用内存,因为有static成员变量。

2). 效率:因为Monostate模式中创建的是真正的对象,因此需要创建和销毁开销。

3). 不可转换:无法把一个非MonoState 的对象通过子类化变为MonoState.

 

参考: Agile Software Development

        Principles, Patterns, and Practices

 

转载于:https://www.cnblogs.com/youzai/archive/2007/12/24/1013103.html

Singleton 与 MonoState 模式相关推荐

  1. Singleton 和 Monostate 模式

    Singleton 和 Monostate 模式 怎样才能使得两个实例表现得像一个对象呢?很简单,只要把所有的变量都变成静态变量即可. public class Monostate {private ...

  2. Monostate模式

    请注意这两个模式的区别,在于一个关注行为,而另一个关注结构.Singleton模式强调结构上的单一性.它防止创建多个对象实例.相反,Monostate模式则强制行为上的单一性,而没有加强结构方面的限制 ...

  3. javascript设计模式-singleton(单例)模式

    singleton(单例)模式被熟知的原因是因为它限制了类的实例化次数只能一次,单例模式,在该实例不存在的勤快下,可以通过一个方法创建一个类来实现创建类的新实例:如果实例已经存在,则会简单返回该对象的 ...

  4. 设计模式学习之--Singleton(单例)模式

    1.Singleton单例模式,是一种责任型模式.这种模式,通过隐藏构造器和提供对创建对象的单个访问点,实现了将类的职责---创建一个担当着独一无二角色的对象(生产唯一实例),集中于类的单个实例中. ...

  5. C#面向对象设计模式第二讲:Singleton Pattern单件模式(创建型模式)

    (根据MSDN Webcast相关课程整理) 模式分类: 从目的来看: 创建型(Creational):负责对象的创建 结构型(Structural):处理类与对象间的组合 行为型(Behaviora ...

  6. Visual Basic了解

    Visual Basic是一种由微软公司开发的结构化的.模块化的.面向对象的.包含协助开发环境的事件驱动为机制的可视化程序设计语言.这是一种可用于微软自家产品开发的语言.它源自于Basic编程语言.V ...

  7. Visual Basic编程语言

    1991年,美国微软公司推出了Visual Basic 1.0(可简称VB),1992年,Microsoft公司又推出 V<wbr></wbr>B<wbr>< ...

  8. Visual Basic 历史版本大回顾

    Visual Basic从1991年诞生以来,现在已经13年了.BASIC是微软的起家产品,微软当然不忘了这位功臣.随着每一次微软技术的浪潮,Visual Basic都会随之获得新生.可以预见,将来无 ...

  9. The Singleton of Design Pattern单态模式

    1 Singleton Definition 单态模式定义        The main purpose is to gurantee that the instance of class has ...

最新文章

  1. python详细安装教程3.7.0-Linux 安装Python3.7.0
  2. Class类是什么? Class.forName()是干什么的?
  3. *args and **kwargs in Python 变长参数
  4. Js判断下拉框是否为空值
  5. Spring Boot 2.3.x 分层构建 Docker 镜像实战
  6. mysql设置php权限_MYSQL新建用户并设置权限
  7. 服务器返回一个无效的JSON string,处理
  8. python表格处理免费教程_手把手教你用Python处理Excel表格
  9. Captaris Workflow开发系列课程介绍。
  10. wordpress插件-WP Rocket 3.10.1_去广告已授权
  11. 2021年Q2全球智能手机销量小米升至第二,苹果降至第三
  12. Cortex M3/M4 学习摘要(一)
  13. [Everyday Mathematics]20150112
  14. Eclipse中添加Windows Builder进行Swing图形界面设计
  15. 什么是jsp,什么是Servlet?jsp 和Servlet 有什么区别
  16. 基于51单片机的模拟信号检测系统
  17. C基础:程序执行时间的计算方法的三种方式
  18. idea git 各种颜色代表的含义
  19. 网站关键词排行优化技巧
  20. 51Nod 1677 treecnt

热门文章

  1. 所有的生意都是在做两件事
  2. 35岁真的是职场分水岭吗?
  3. OpenCV之图像的混合
  4. sphinx 入门_Sphinx搜索引擎入门
  5. 比较和同步两个SQL Server数据库之间的图像
  6. oracle ola_Ola HallengrenSQL Server维护解决方案–数据库完整性检查
  7. 【转载】如何知道自己适合做什么
  8. Linux实战教学笔记50:Zabbix监控平台3.2.4(二)深入理解zabbix
  9. java复习web篇——servlet
  10. 20145335郝昊《网络对抗》逆向及Bof基础实践