模式分类:

从目的来看:
1.创建型(Creational)模式:负责对象创建。
2.结构型(Structural)模式:处理类于对象间的组合。
3.行为型(Behavioral)模式:类与对象交互中的职责分配。
从范围看:
1.类模式处理类于子类的静态关系。
2.对象模式处理对象间的动态关系。

动机

在软件系统中,经常有一些这样特殊的类,必须保证他们在系统中只存在一个实例,才能确保他们的逻辑正确性、以及良好的效率。
绕过常规的构造器,提供一种机制保证一个类只有一个实例。

意图

保证一个类仅有一个实例,并提供一个该实例的全局访问点。

结构

单线程Singleton模式实现:

public class Singleton
{
private static Singleton Instance;
private Singleton() {} public static Singleton Instance
{
get
{
if(instance == null)
{
instance = new Singleton();
}
return instance;
}
}
}
或者:
public class Singleton
{
private static Singleton Instance = new Singleton();
private Singleton() {}
public static Singleton Instance
{
get
{
return instance;
}
}
}

两者有啥区别?

第一种可以做到LazyLoad。
判断对象的引用:
Object.ReferenceEquals(t1,t2)

单线程Singleton模式的几个要点

1.单例模式可以设置为protected允许派生子类。
2.单例模式一般不支持ICloneable接口,这可以导致多个实例,于单例模式初衷违背。
3.单例模式不要支持序列化,序列化,反序列化形成了深拷贝,于单例模式初衷违背
4.单例模式没有考虑对象销毁,对于存在垃圾回收的平台不需要考虑,一般不会让类很大。所以消耗很小
5.不能应对多线程环境:在多线程环境下,使用Singleton模式仍有可能得到Singleton类的多个实例对象。

多线程Singleton模式

public class Singleton
{
private static volatile Singleton Instance = ;
private static object lockHelper = new Object();
private Singleton() {}
public static Singleton Instance
{
get
{
if(instance == null)
{
lock(lockHelper)
{
if(instance == null)
{
instance = new Singleton();
}
}
}
return instance;
}
}
}
双检查(Double Check):就是为了防止多线程的实例创建。
编译器代码编译的时候,会进行代码顺序微调,加了volatile保证代码编译不调整指令。
class Singleton
{
public static readonly Singleton Instance = new Singleton();
private Singleton() {}
}

class Singleton
{
public static readonly Singleton Instance;
static Singleton()
{
Instance = new Singleton();
}
private Singleton();
}
的效果是一样的。
静态构造器的角色:
1.静态构造器的执行时间:只在静态字段初始化之前初始化。(内敛初始化会把初始化放到静态构造器中初始化。)
beforefieldinit
2.dot net 机制保证了静态构造器确保了只有一个执行静态构造器。不会有多个静态构造器执行。
3.不支持参数的构造器。

使用.Net类型初始化机制实现多线程Singleton模式

public 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;
}
}

Singleton模式扩展

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

单例模式——Singleton的更多相关文章

  1. 设计模式之单例模式——Singleton

                        设计模式之单例模式--Singleton 设计意图: 保证类仅有一个实例,并且可以供应用程序全局使用.为了保证这一点,就需要这个类自己创建自己的对象,并且对外有 ...

  2. 【白话设计模式四】单例模式(Singleton)

    转自:https://my.oschina.net/xianggao/blog/616385 0 系列目录 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factor ...

  3. ooad单例模式-Singleton

                                                单例模式Singleton 主要作用是保证在Java应用程序中,一个类Class只有一个实例存在. 比如建立目录 ...

  4. iOS单例模式(Singleton)写法简析

    单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 1.单例模式的要点: 显然单例模式的要点有三个:一是某个类只能有一个实例: ...

  5. 浅谈设计模式--单例模式(Singleton Pattern)

    题外话:好久没写blog,做知识归纳整理了.本来设计模式就是个坑,各种文章也写烂了.不过,不是自己写的东西,缺少点知识的存在感.目前还没做到光看即能记住,得写.所以准备跳入设计模式这个大坑. 开篇先贡 ...

  6. 设计模式之——单例模式(Singleton)的常见应用场景

    单例模式(Singleton)也叫单态模式,是设计模式中最为简单的一种模式,甚至有些模式大师都不称其为模式,称其为一种实现技巧,因为设计模式讲究对象之间的关系的抽象,而单例模式只有自己一个对象,也因此 ...

  7. 设计模式之单例模式(Singleton Pattern)

    单例模式 单例模式(Singleton Pattern)在java中算是最常用的设计模式之一,主要用于控制控制类实例的数量,防止外部实例化或者修改.单例模式在某些场景下可以提高系统运行效率.实现中的主 ...

  8. 设计模式(4) -- 单例模式(Singleton)

    设计模式(4)  -- 单例模式(Singleton) 试想一个读取配置文件的需求,创建完读取类后通过New一个类的实例来读取配置文件的内容,在系统运行期间,系统中会存在很多个该类的实例对象,也就是说 ...

  9. IOS单例模式(Singleton)

    IOS单例模式(Singleton)   单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 1.单例模式的要点: 显然单例模 ...

  10. java设计模式之 单例模式 Singleton

    static 的应用 单例模式 Singleton 单例:保证一个类在系统中最多只创建一个实例. 好处:由于过多创建对象实例,会产生过多的系统垃圾,需要GC频繁回收,由于GC会占用较大的系统资源,所有 ...

随机推荐

  1. 欧几里德&扩展以及求解线性方程学习总结--附上poj1061解题报告

    欧几里德算法: 欧几里德就是辗转相除法,调用这个gcd(a,b)这个函数求解a,b的最大公约数 公式: gcd(a,b)=gcd(b,a%b):并且gcd(a,b)=gcd(b,a)=gcd(-a,b ...

  2. mysql处理大数据量的查询速度究竟有多快和能优化到什么程度

    mysql处理大数据量的查询速度究竟有多快和能优化到什么程度 深圳-ftx(1433725026) 18:10:49  mysql有没有排名函数啊 横瓜(601069289) 18:13:06  无 ...

  3. Spring优势

    *  使用spring有什么好处? ◆Spring能有效地组织你的中间层对象,无论你是否选择使用了EJB.如果你仅仅使用了Struts或其他的包含了J2EE特有APIs的framework,你会发现S ...

  4. [ASP.NET]更简单的方法:FormsAuthentication登录ReturnUrl使用绝对路径

    转自:http://www.cnblogs.com/dudu/p/formsauthentication-returnurl-absoluteuri.html [ASP.NET]更简单的方法:Form ...

  5. js 控制DIV 预览打印

    Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> ...

  6. CSS3- px、em、rem区别介绍

    PX px像素(Pixel).相对长度单位.像素px是相对于显示器屏幕分辨率而言的. PX特点 1. IE无法调整那些使用px作为单位的字体大小: 2. 国外的大部分网站能够调整的原因在于其使用了em ...

  7. Mac OS X取消Apache(httpd)开机启动

    安装MAMP后,启动服务时提示Apache启动失败,80端口被占用.查看进程发现存在几个httpd. OS X自带Apache,可是默认是没有启动的.我也没有开启Web共享,怎么就开机启动了呢? 不知 ...

  8. 用DataBaseMail发图片并茂的邮件

    不知道各位的老板有没有这样的要求, 一些系统中的数据需要定时发出邮件提醒, 如呆料就要到期或者一些待办的事项提醒. 当然这些用SSRS报表订阅可以实现,但有些公司没有设定相应的报表服务,又或者只是一些 ...

  9. java 正则表达式学习

    一. Java正则表达式 在程序开发中,难免会遇到需要匹配.查找.替换.判断字符串的情况发生,而这些情况有时又比较复杂. 因此,学习及使用正则表达式,便成了解决这一矛盾的主要手段. 正则表达式是一种可 ...

  10. HDU 4336 Card Collector 数学期望(容斥原理)

    题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=4336 题意简单,直接用容斥原理即可 AC代码: #include <iostream> ...