单例模式

01 浅谈【创建型】单例模式

Deadly 提交于 2019-12-01 17:18:56
单例模式 所谓单例模式,就是这个类在你的系统中只作为一个的存在,是为了防止重复的创造对象、销毁对象所带来的内存的开销。并且在这个类当中提供一个全局访问点 主要解决: 一个全局使用的类频繁地创建与销毁。 何时使用: 当您想控制实例数目,节省系统资源的时候。 特点: 单例类只有一个实例对象; 该单例对象必须由单例类自行创建; 单例类对外提供一个访问该单例的全局访问点; 举个栗子: 大家都知道我们用SpringBoot作为服务端,向前台返回数据的时候,一般返回的都是JsonObject 这个Object所有的控制器返回数据都可以用到,我们这里就可以考虑用单例模式来初始化这个类, 单例模式在这里分为好几个模块; 懒汉式 饿汉式(最常用)在初始化类的时候就初始化成员变量 public class JsonObject { private static Map<String,Object> map = new HashMap<>(16); //构造方法私有 private JsonObject(){} //提供全局访问点 synchronized(线程安全) public static synchronized Object resultOk(Object data){ map.clear(); map.put("status","ok"); map.put("data",data); map

java单例模式八种实现方式

北城余情 提交于 2019-12-01 17:11:15
饿汉式两种 懒汉式三种 双重检验 静态内部类 枚举 一.饿汉式(两种)  1.静态常量 1 /** 2 * @author 79282 3 * 单列模式第一种 写法:饿汉式(静态常量) 4 */ 5 public class Singleton01 { 6 //私有化构造器 7 private Singleton01() { 8 9 } 10 11 //私有静态常量 12 private static final Singleton01 INSTANCE = new Singleton01(); 13 14 //get方法 15 public static Singleton01 getInstance() { 16 return INSTANCE; 17 } 18 19 } 20 class Test01{ 21 public static void main(String[] args) { 22 Singleton01 instance01 = Singleton01.getInstance(); 23 Singleton01 instance02 = Singleton01.getInstance(); 24 System.out.println(instance01 == instance02); 25 } 26 27 } 2.静态代码块 1 /** 2 *

单例模式

两盒软妹~` 提交于 2019-12-01 16:25:39
#include <mutex> #include <thread> #include <sstream> #include <iostream> #include <vector> std::once_flag g_flag; class Singleton { private: Singleton(){} static void CreateInstance() { pToSelf = new Singleton(); static ToDestroy destroy; } public: static Singleton* getInstance() { std::call_once(g_flag, CreateInstance); return pToSelf; } private: static Singleton* pToSelf; class ToDestroy { public: ~ToDestroy() { if(Singleton::pToSelf) { delete Singleton::pToSelf; pToSelf = nullptr; std::cout << "~ToDestroy() call \n"; } } }; }; Singleton* Singleton::pToSelf = nullptr; struct pcout: public

设计模式——单例模式

不羁岁月 提交于 2019-12-01 15:07:19
单例模式 (Singleton Pattern)使用的比较多,比如我们的 controller 和 service 都是单例的,但是其和标准的单例模式是有区别的。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。 模式结构 单例模式的结构很简单,只涉及到一个单例类,这个单例类的构造方法是私有的,该类自身定义了一个静态私有实例,并向外提供一个静态的公有函数用于创建或获取该静态私有实例。 源码导读 单例模式分为懒汉单例和饿汉单例;饿汉单例代码很简单,顾名思义,饿汉单例就是类初始化的时候就将该单例创建,示例代码如下: public class Singleton { private static final Singleton singleton = new Singleton(); //限制产生多个对象 private Singleton(){ } //通过该方法获得实例对象 public static Singleton getSingleton(){ return singleton; } //类中其他方法,尽量是 static public static void doSomething(){ } }

设计模式之美—单例模式

隐身守侯 提交于 2019-12-01 11:39:08
单例模式 什么是单例? 该类只能有一个实例。 该类负责创建自己的对象。 在整个项目中都能访问到这个实例。 应用场景 读配置文件时,维护全局的Config类。 线程池、连接池,统一进行分配和管理。 网站的计数器,也可以采用单例模式实现,保持同步 代码实现 饿汉式    中国古代神话中有女娲补天一说,现在天破了,我们去求女娲补天。   女娲用英语来说是 A Goddess In Chinese Mythology,意思就是神话中的女神,女娲是独一无二的,现在我们就建一个女神类Goddess。 1 public class Goddess { 2 3 }   神话中,我们都是女娲造出来的,人是不能造女娲的,所以要女娲 私有化构造。 1 public class Goddess { 2 private Goddess(){};//私有化构造 3 }   既然人不能女娲,那女娲是怎么来的,女娲伴随天地初开产生的,所以要 自己创建对象 。 1 public class Goddess { 2 private static final Goddess goddess = new Goddess();//自己创建对象 3 private Goddess(){};//私有化构造 4 }   女娲是神秘的,凡胎肉眼看不到所以要private,static保证了女娲伴随天地初开,在内存中永生

设计模式-单例模式

风流意气都作罢 提交于 2019-12-01 09:10:06
单例模式 饿汉式(急切实例化) public class EagerSingleton { /** 1.私有化构造方法 */ private EagerSingleton() { } /** 2.声明静态成员变量并赋初始值-类初始化的时候静态变量就被加载,因此叫做饿汉式 */ public static EagerSingleton eagerSingleton=new EagerSingleton(); /** 3.对外暴露公共的实例化方法 */ public static EagerSingleton getInstance(){ return eagerSingleton; } } 懒汉式(延迟实例化)(DCL双重检测)   -为什么要判断两次?      避免由于并发导致的线程安全问题   -为什么要使用 volatile关键字修饰 ourInstance?    避免指令重排序,同时保证变量ourInstance在线程之间是可见的 public class LazySingleton { /** 1.私有化构造方法 */ private LazySingleton() { } /** 2.声明静态变量 -这里声明为volatile,是禁止指令重排序 */ private volatile static LazySingleton ourInstance; /** 3

day22 封装、继承和程序设计模式

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-01 08:39:08
目录 day22 封装、继承和程序设计模式 今日内容概要 昨日回顾 今日内容详细 封装 多态 常见设计模式 day22 封装、继承和程序设计模式 今日内容概要 封装 继承 程序设计模式 单例模式 工厂模式 昨日回顾 一对多组合关系 将多个类的对象作为属性,封装在新类中 继承 class 类名(父类名): 属性 方法 isinstance和issubclass 子类会继承所有父类中的属性和方法,可以直接使用 子类可以重写父类中的属性和方法 super方法可以在子类中调用父类中的方法 super(cls, obj) ,cls参数可以为任意类名,obj可以为任意类,只要合理即可 今日内容详细 封装 “封装”就是将抽象得到的数据和行为相结合,形成一个有机整体 元组,列表,字典等等:数据的封装,通过引用去使用数据 函数:算法的封装 如果没有函数,功能要靠每一行代码去直接执行 没有函数的话,耦合度会很高,复用性很差,开发效率也非常低 封装的目的是简化编程和增加安全性 使用者不必关系具体的实现细节 通过接口(万能的点 . ) 还可以给予特定的访问权限来使用类的成员 明确区分内外 类的实现者 可以修改内部封装的东西而不影响外部调用者 外部调用者 只需要直到自己可以使用该类对象的哪些功能 私有属性和私有方法 标识符以双下划线 __ 开头的是私有成员,在外部不可以直接用这种属性或方法名调用

实现单例模式的5中方法

你离开我真会死。 提交于 2019-12-01 08:11:46
使用类简单实现 1 class Singleton(object): 2 def __init__(self): 3 pass 4 5 def instance(cls, *args, **kwargs): 6 if not hasattr(Singleton, '_instance'): 7 Singleton._instance = Singleton(*args, **kwargs) 8 return Singleton._instance 缺点:多线程时会出错。例如:当两个线程启动时同时检测到Singleton没有_instance时,两个线程会同时创建两个实例。 改进:加锁 1 class Singleton(object): 2 def __init__(self): 3 pass 4 5 def instance(cls, *args, **kwargs):      #加锁      lock() 6 if not hasattr(Singleton, '_instance'): 7 Singleton._instance = Singleton(*args, **kwargs)      #解锁      unlock() 8 return Singleton._instance 缺点:加锁 效率降低。且若已经有实例对象那么就不需要再加锁。 改进:双重判断。

java设计模式——单例模式

半腔热情 提交于 2019-12-01 07:58:29
整理一下设计模式的个人理解。 描述 单例模式是java中比较常见的一种设计模式,顾名思义为一个类只能创建一个实例,多用于全局对象,如:配置的加载,spring bean加载各种配置(spring容器所有bean默认都是单例) 单例的特点为构造方法私有,因此必须内部进行实例化,并提供静态访问方法为其他对象提供该实例。即: 1、单例只能有一个实例 2、单例构造方法私有 3、单例必须自己创建唯一实例,并提供其他对象访问该实例的静态方法 优缺点 优点:由于单例模式只生成了一个实例,所以能够节约系统资源,减少性能开销,提高系统效率,同时也能够严格控制客户对它的访问。 缺点:因为系统中只有一个实例,这样就导致了单例类的职责过重,违背了“单一职责原则”,没有接口,不能继承,不方便扩展。 实现 1> 懒汉式-线程不安全 public class Singleton1 { private static Singleton1 instance; /** * 构造方法私有 */ private Singleton1() { } /** * 提供静态访问实例方法 * 懒加载,其他地方用到该实例时调用该方法/创建实例,多线程时可能会创建多个实例,线程不安全 * * @return */ public static Singleton1 getInstance() { if (instance == null

[设计模式] 单例模式

人盡茶涼 提交于 2019-12-01 07:57:31
一 简介   单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在。   许多时候整个系统只需要拥有一个全局的对象,这样有利于我们协调系统整体的行为。   比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。 二 基本的实现思路   单例的实现主要是通过以下两个步骤:     1、将该类的 构造方法定义为私有方法 ,这样其他处的代码就无法通过调用该类的构造方法来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例;     2、在该类内提供一个静态方法,当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用。 三 注意事项   单例模式在多线程的应用场合下必须小心使用。如果当唯一实例尚未创建时,有两个线程同时调用创建方法,那么它们同时没有检测到唯一实例的存在,从而同时各自创建了一个实例,这样就有两个实例被构造出来,从而违反了单例模式中实例唯一的原则。 解决这个问题的办法是为指示类是否已经实例化的变量提供一个互斥锁(虽然这样会降低效率)。 四 单例模式的几种写法 1 饿汉模式(静态变量)【可用】 /** * 单例模式 - 饿汉模式 */