单例模式

单例模式的八种写法比较

泪湿孤枕 提交于 2019-11-28 07:44:59
  单例模式是最常用到的设计模式之一,熟悉设计模式的朋友对单例模式都不会陌生。一般介绍单例模式的书籍都会提到 饿汉式 和 懒汉式 这两种实现方式。但是除了这两种方式,本文还会介绍其他几种实现单例的方式,让我们来一起看看吧。 简介 单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在。 许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。 基本的实现思路 单例模式要求类能够有返回对象一个引用(永远是同一个)和一个获得该实例的方法(必须是静态方法,通常使用getInstance这个名称)。 单例的实现主要是通过以下两个步骤: 将该类的构造方法定义为私有方法,这样其他处的代码就无法通过调用该类的构造方法来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例; 在该类内提供一个静态方法,当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用。 注意事项 单例模式在多线程的应用场合下必须小心使用。如果当唯一实例尚未创建时,有两个线程同时调用创建方法

python实现单例模式

ぃ、小莉子 提交于 2019-11-28 07:26:34
class SingletonType(type): def __init__(self,*args,**kwargs): super(SingletonType,self).__init__(*args,**kwargs) def __call__(cls, *args, **kwargs): # 这里的cls,即Foo类 print('cls',cls) obj = cls.__new__(cls,*args, **kwargs) cls.__init__(obj,*args, **kwargs) # Foo.__init__(obj) return obj class Foo(metaclass=SingletonType): # 指定创建Foo的type为SingletonType def __init__(self,name): self.name = name def __new__(cls, *args, **kwargs): return object.__new__(cls) obj = Foo('xx') 来源: https://www.cnblogs.com/zhaogang0104/p/11938683.html

PHP设计模式

吃可爱长大的小学妹 提交于 2019-11-28 04:03:35
工厂模式   一处代码 多出调用(减少代码冗余) 单例模式   仅可实例化一次(例如:链接数据库的代码,应该使用单例模式仅允许实例化一次,来减少服务器资源的消耗) 来源: https://www.cnblogs.com/yulongcode/p/11391066.html

单例设计模式

时间秒杀一切 提交于 2019-11-28 00:44:36
饿汉式 :线程安全(普通) Class Singleton{ private Singleton(){} //1.私有构造函数 private static Singleton instance = new Singleton (); //2.创建本类对象 public static Singleton getInstance(){ //3.对外提供公共的访问方式 return instance; } } 懒汉式:线程不安全(普通) public class Singleton {   private Singleton(){}; // 1.私有构造函数    private static Singleton instance; // 2.声明一个本类的引用    public static Singleton getInstance(){ // 3.对外提供公共的访问方式      if (instance == null ){       instance = new Singleton();     }     return instance;   } } 饿汉式:线程安全(使用static final修饰,不能被更改) 1 class Singleton { 2 private Singleton(){}; 3 public static final Singleton s

Android单例模式

拟墨画扇 提交于 2019-11-28 00:23:19
一、单例模式 1.定义 作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。 2.特点 单例类只能有一个实例。 单例类必须自己创建自己的唯一实例。 单例类必须给所有其他对象提供这一实例。 二、创建单例模式的方法 1.懒汉式,线程不安全 懒汉式其实是一种比较形象的称谓。既然懒,那么在创建对象实例的时候就不着急。会一直等到马上要使用对象实例的时候才会创建,懒人嘛,总是推脱不开的时候才会真正去执行工作,因此在装载对象的时候不创建对象实例。 public class Singleton { private static Singleton instance; private Singleton (){} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } 这段代码简单明了,而且使用了懒加载模式,但是却存在致命的问题。当有多个线程并行调用 getInstance() 的时候,就会创建多个实例。也就是说在多线程下不能正常工作。 2.懒汉式,线程安全 为了解决上面的问题,最简单的方法是将整个 getInstance() 方法设为同步(synchronized)。

java设计模式----单例模式

荒凉一梦 提交于 2019-11-27 23:51:00
单例模式保证一个类中只有一个实例且该实例易于外界访问。 懒汉模式(实现了懒加载,不需要同步的情况下效率低) public class SingletonClass{ private static SingletonClass instance=null; public static synchronized SingletonClass getInstance() { if(instance==null) { instance=new SingletonClass(); } return instance; } private SingletonClass(){ } } 饿汉模式(基于classloder机制避免了多线程的同步问题) public static class Singleton{ //在自己内部定义自己的一个实例,只供内部调用 private static final Singleton instance = new Singleton(); private Singleton(){ //do something } //这里提供了一个供外部访问本class的静态方法,可以直接访问 public static Singleton getInstance(){ return instance; } } 懒汉模式和饿汉模式都是在类初始化即实例化instance 双重锁模式

单例模式---恶汉模式

限于喜欢 提交于 2019-11-27 19:44:36
单例模式 package single;​public class Monitor { //开始没有班长,用静态属性表示 private static Monitor monitor=null; //构造方法私有化,防止出现多个班长对象 private Monitor(){}; public static Monitor getmonitor(){ if(monitor==null){ monitor=new Monitor(); } return monitor; }} 首先班里没有班长,用静态属性表示. 将班长类中的班长属性私有化,防止在其他地方实例化,出现多个班长对象. 定义一个获取班长的方法,没有就new一个,有的话就返回已有对象. 以上代码看起来逻辑正确,但是学习过多线程就能够知道,该类存在线程安全问题. 现在有线程A,B,全部在monitor=null的情况下进入方法体中,这样就会有两个班长对象产生,显然是不对的,那么我们让代码更新一下 package single;​public class Monitor { //开始没有班长,用静态属性表示 private static Monitor monitor=null; //构造方法私有化,防止出现多个班长对象 private Monitor(){}; public static synchronized Monitor

设计模式-单例模式详解

我的梦境 提交于 2019-11-27 19:35:46
一、引言    单例模式应该算是23种设计模式中比较简单的,它属于创建型的设计模式,关注对象的创建。 二、概念   单例模式是23个“Gang Of Four”的设计模式之一, 它描述了如何解决重复出现的设计问题 ,以设计灵活且可复用的面向对象软件,使对象的实现、更改、测试和重用更方便。 单例模式解决了以下问题: 如何确保类只有一个实例? 如何轻松地访问类的唯一实例? 如何控制类的实例化? 如何限制类的实例数量? 单例模式是如何解决以上问题的呢? 隐藏类的构造函数。 定义一个返回类的唯一实例的公共静态操作。 这个设计模式的关键点在于使类控制其自身的实例化。 隐藏类的构造函数(定义私有构造函数)来确保类不能从外部实例化。 使用静态函数轻松访问类实例(Singleton.getInstance())。 三、实现 1、懒汉式单例 1 using System.Threading; 2 3 public class SingletonTest 4 { 5 private static SingletonTest instance = null; 6 7 /// <summary> 8 /// 隐藏类的构造函数(定义私有构造函数)来确保类不能从外部实例化 9 /// </summary> 10 private SingletonTest() 11 { 12 Console.WriteLine

java 多线程-单例模式

喜你入骨 提交于 2019-11-27 18:47:16
单例模式 对外只有一个对象,对内不管,比如每台电脑都只有一个的任务管理器 1、构造去私有化 2、内部提供私有静态属性--存储对象的地址 3、提供公共的静态方法访--获取属性 public class my { //2、提供私有静态属性 private volatile static my instance; //避免new对象时指令重排 //1、构造器私有化 private my(){ } //3、提供公共静态方法访问属性 public static my getInstance() { if(null!=instance) //如果已经创建好对象,则不需要多个线程等待创建对象 { return instance; } synchronized(my.class) //绑定类的模子 { if(null==instance) //多线程可能创建多个对象,加入同步 { instance=new my();//可能发生指令重排 //new对象发生:1、开辟空间2、初始化对象信息3、返回对象的地址给引用instance //过程很慢,可能第三步会提前于第二步,a线程可能在初始化信息的时候 ,b线程可能已经拿到对象 //加入voliatle避免这种情况 } } return instance; } public static void main(String[]args) throws

设计模式之单例模式

[亡魂溺海] 提交于 2019-11-27 16:19:29
单例模式 设计模式总分类分类 创建型模式( 5种 ) 结构型模式( 7种 ): 行为型模式( 11种 ): 单例模式 作用 应用场景 优势 单例模式五种实现方式 饿汉式 懒汉式 静态内部类式 双重检测锁 枚举式 五种单例模式总结 单例模式选取策略 设计模式总分类分类 创建型模式( 5种 ) 单例模式 工厂模式 抽象工厂模式 建造者模式 原型模式 结构型模式( 7种 ): 适配器模式 桥接模式 装饰模式 组合模式 外观模式 享元模式 代理模式 行为型模式( 11种 ): 模版方法模式 命令模式 迭代器模式 观察者模式 中介者模式 备忘录模式 解释器模式 状态模式 策略模式 职责链模式 访问者模式 单例模式 作用 保证一个类只有一个实例,并且提供一个访问该实例的全局访问点。 应用场景 优势 只生产一个实例 ,减少系统开销 单例模式可以在系统设置全局的访问点,优化环共享资源访问,例如可以设计 一个单例类,负责所有数据表的映射处理 当一个对象的产生需要比较多的资源时,如读取配置、产生其他依赖对象时,则可以通过在应用启动 时直接产生一个单例对象,然后永久驻留内存的方式来解决 单例模式五种实现方式 饿汉式 package ah . szxy . singleton ; /** * 单例模式-饿汉式 * * 创建一个类的对象并初始化 * 创建一个获取它的方法,返回这对象 * * @author