模式分类:

从目的来看:
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对一个类的实例构造器的任意调用。”

转载于:https://www.cnblogs.com/9527y/p/3923458.html

单例模式——Singleton相关推荐

  1. python3中的单例模式Singleton

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Date : 2019-01-21 09:09:09 # @Author : cdl (1217096 ...

  2. Android设计模式——单例模式(Singleton)

    二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元 ...

  3. 【设计模式】单例模式 Singleton Pattern

    通常我们在写程序的时候会碰到一个类只允许在整个系统中只存在一个实例(Instance)  的情况, 比如说我们想做一计数器,统计某些接口调用的次数,通常我们的数据库连接也是只期望有一个实例.Windo ...

  4. python单例_Python - 单例模式(Singleton)

    单例模式(Singleton) 本文地址: http://blog.csdn.net/caroline_wendy/article/details/23374575 单例模式 , 类的实例从始至终, ...

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

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

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

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

  7. 设计模式(21):创建型-单例模式(Singleton)

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于 ...

  8. 设计模式之单例模式(Singleton)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式包括:1.FactoryMethod(工厂方法模式):2.Abstract Factory(抽象工厂模式):3.Sin ...

  9. Golang 单例模式 singleton pattern

    在Java中,单例模式的实现主要依靠类中的静态字段.在Go语言中,没有静态类成员,所以我们使用的包访问机制和函数来提供类似的功能.来看下下面的例子: package singletonimport ( ...

最新文章

  1. onWindowFocusChanged重要作用(得到/失去焦点call) 、
  2. asp.net core 使用 Redis 和 Protobuf 进行 Session 缓存
  3. Python Configparser模块读取、写入配置文件
  4. MySQL如何跨机器迁移数据?
  5. ZetCode Spring 教程
  6. emui内核支持kvm吗_EMUI和MIUI为什么不基于安卓linux内核不使用虚拟机直接用c++开发一些更流畅系统自带软件呢?...
  7. AlteraFPGA使用通用SPIFlash
  8. 下载google drive文件
  9. 联想笔记本重装系统无法进入记录
  10. 基于N-gram的双向最大匹配中文分词
  11. 【站内题解】十六道csdn每日一练Python题解
  12. 学习历程——词法分析器
  13. Python基本编程题
  14. mac node如何升级版本
  15. Fzu 2198 快来快来数一数【矩阵快速幂】
  16. 多道批处理系统、分时操作系统
  17. 高德地图轨迹PHP,高德地图JSAPI轨迹重复绘制
  18. 2022年最新版大数据面试题全面总结-持续更新
  19. Ubuntu21安装deepstream5.1
  20. 英文分词算法(Porter stemmer)

热门文章

  1. ImportError: Failed to import `pydot`. Please install `pydot`. For example with `pip install pydot`
  2. 台式电脑可以练计算机二级嘛6,练习六-计算机二级考试OFFICE高级应用试卷与试题.pdf...
  3. php json.parse,PHP JSON头导致JSON.parse出错(使用jQuery)
  4. RabbitMQ(九):RabbitMQ 延迟队列,消息延迟推送(Spring boot 版)
  5. 不愧是摸鱼高手Python matplotlib 绘制频谱图都会,能怪老板不管
  6. 超详细的Python matplotlib 绘制直方图 赶紧收藏
  7. mysql邮箱认证_邮箱验证功能的实现
  8. 安卓按键精灵_月薪3w的按键精灵大神都是从这个命令开始起步的
  9. java apache压缩多个文件大小_Java压缩多个文件并导出
  10. 英文字典设计c语言代码,一种简单的英文词典排版系统