单例模式

单例模式学习(一)

巧了我就是萌 提交于 2019-11-28 13:10:26
什么是单例?为什么要用单例? 一个类被设计出来,就代表它表示具有某种行为(方法),属性(成员变量),而一般情况下,当我们想使用这个类时,会使用 new 关键字,这时候jvm会帮我们构造一个该类的实例。而我们知道,对于 new 这个关键字以及该实例,相对而言是比较耗费资源的。所以如果我们能够想办法在jvm启动时就 new 好,或者在某一次实例 new 好以后,以后不再需要这样的动作,就能够节省很多资源了。 哪些类可以使用单例? 一般而言,我们总是希望 无状态 的类能够设计成单例,那这个 无状态 代表什么呢? 简单而言,对于同一个实例,如果多个线程同时使用,并且不使用额外的线程同步手段,不会出现线程同步的问题,我们就可以认为是 无状态 的,再简单点:一个类没有成员变量,或者它的成员变量也是 无状态 的,我们就可以考虑设计成单例。 实现方法 好了,我们已经知道什么是单例,为什么要使用单例了,那我们接下来继续讨论下怎么实现单例。 一般来说,我们可以把单例分为 行为上的单例 和 管理上的单例 。 行为上的单例 代表不管如何操作(此处不谈cloneable,反射),至始至终jvm中都只有一个类的实例,而 管理上的单例 则可以理解为:不管谁去使用这个类,都要守一定的 规矩 ,比方说,我们使用某个类,只能从指定的地方’去拿‘,这样拿到就是同一个类了。 而对于 管理上的单例

单例模式

拈花ヽ惹草 提交于 2019-11-28 13:05:31
枚举类实现线程安全 单例模式: 单例模式是常用的设计模式,作用是确保某个类只有一个实例吗,自行实例化并向整个系统提供这个实例。线程池、缓存、日志对象、对话框对象等常被设计成单例, 选择单例模式是为了避免不一致的状态 简单的实现可参考 单例模式 但是这样实现仍然存在缺点:序列化可能会破坏单例模式,每次反序列化一个序列化的对象实例时都会创建一个新的实例 可以使用枚举来实现,如下 public enum SingletonEnum { INSTANCE; private String name; public String getName(){ return name; } public void setName(String name){ this.name = name; } } 直接使用 SingletonEnum.INSTANCE来 进行访问,不用考虑序列化和反射的问题。 来源: https://www.cnblogs.com/jhin-wxy/p/11408242.html

设计模式简介及常用应用场景

有些话、适合烂在心里 提交于 2019-11-28 12:48:42
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 其实还有两类:并发型模式和线程池模式。 常用应用场景: 工厂模式 :IOC就是典型的工厂模式 代理模式 :AOP就是代理实现的 Facade模式 :shiro框架的核心 单例模式 Spring默认就是单例 不变模式 string 八大基本数据类型都是单例 Future 模式 异步调用。即请求时只拿到一个契约,约定以后可以获取这个东西 来源: https://www.cnblogs.com/duguangming/p/11407721.html

什么是单例模式?单例模式有什么作用?为什么要用单例模式

空扰寡人 提交于 2019-11-28 12:26:23
单例模式 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。 注意: 1、单例类只能有一个实例。 2、单例类必须自己创建自己的唯一实例。 3、单例类必须给所有其他对象提供这一实例。 介绍 意图: 保证一个类仅有一个实例,并提供一个访问它的全局访问点。 主要解决: 一个全局使用的类频繁地创建与销毁。 何时使用: 当您想控制实例数目,节省系统资源的时候。 如何解决: 判断系统是否已经有这个单例,如果有则返回,如果没有则创建。 关键代码: 构造函数是私有的。 应用实例: 1、一个党只能有一个书记。 2、Windows 是多进程多线程的,在操作一个文件的时候,就不可避免地出现多个进程或线程同时操作一个文件的现象,所以所有文件的处理必须通过唯一的实例来进行。 3、一些设备管理器常常设计为单例模式,比如一个电脑有两台打印机,在输出的时候就要处理不能两台打印机打印同一个文件。 优点: 1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。 2、避免对资源的多重占用(比如写文件操作)。 缺点:

为什么java中用枚举实现单例模式会更好

五迷三道 提交于 2019-11-28 11:49:51
枚举单例是java中使用枚举提供一个实例对象来实现单例模式的一种新方法,虽然单例模式在java中早已存在,但枚举单例实际上从java5引入枚举作为它的关键特性之后相对来说还是一个新的概念,这篇文章和我先前发表的关于单例的文章有一定的关联性,一篇是 java单例模式的10个面试问题 ,讲的是java面试中关于单例模式常见的10个问题,另一篇是 10个关于java枚举的例子 ,这里面讲了枚举的很多作用。这篇文章是关于我们为什么要使用枚举来实现单例模式,它和传统的单例模式实现方法比起来有哪些好处呢? 下面是我总结的使用枚举实现单例模式的几个原因。另外,如果你喜欢关于设计模式的文章,你也可以看看我发表的关于 生成器模式 和 装饰器模式 的文章。 1)枚举单例模式代码简洁 这是迄今为止最大的优点,如果你曾经在java5之前写过单例模式实现代码,那么你会知道即使是使用双检锁你有时候也会返回不止一个实例对象。虽然这种问 题通过改善java内存模型和使用volatile变量可以解决,但是这种方法对于很多初学者来说写起来还是很棘手。相比用 synchronization的双检索实现方式来说,枚举单例就简单多了。你不相信?比较一下下面的双检索实现代码和枚举实现代码就知道了。 用枚举实现的单例: 这是我们通常写枚举单例的方式,它可能包含实例变量和实例方法,但是简单来说我什么都没用

Java -- 单例设计模式

荒凉一梦 提交于 2019-11-28 11:04:19
单例模式 假设构造器中需要执行1000行代码,需要占用很大的资源,耗时长,像这种情况,就适合使用单例设计模式,只创建一次对象,以后一直使用这个对象。 饿汉式单例设计: 1、构造方法私有化,无法使用new创建实例对象 private Single( ){ } 2、仅创建一个对象,并且类变量私有化 private static Single single = new Single(); 3、使用静态方法返回该类中仅有的实例对象 private static Single getInstance(){ return single; } public class Single { // 私有化构造方法 private Single(){} private static Single single = new Single(); public static Single getSingle() { return single; } } 懒汉式单例设计: 最开始对象是null,直到有第一个调用者,才会创建一个对象,之后所有调用者都用这个对象 1、私有化构造函数 2、静态声明引用为null,private static Single single = null; 3、静态方法返回类的实例,首先判断静态引用是否为空,若为空则创建对象然后返回对象引用,否则直接返回对象引用 public class

单例设计模式

旧街凉风 提交于 2019-11-28 10:41:18
意图: 保证一个类仅有一个实例,并提供一个访问它的全局访问点。 主要解决: 一个全局使用的类频繁地创建与销毁。 何时使用: 当您想控制实例数目,节省系统资源的时候。 如何解决: 判断系统是否已经有这个单例,如果有则返回,如果没有则创建。 关键代码: 构造函数是私有的。 优点: 1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。 2、避免对资源的多重占用(比如写文件操作)。 缺点: 没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。 使用场景: 1 、类的创建 2、创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等。 UML类图 单例模式的几种实现方式 1、懒汉式,线程不安全 2、懒汉式,线程安全 3、饿汉式 4、双检锁/双重校验锁(DCL,即 double-checked locking 5、登记式/静态内部类 6、枚举 来源: https://www.cnblogs.com/gcq243627152qq/p/11938808.html

单例模式正确使用方式

。_饼干妹妹 提交于 2019-11-28 08:45:33
这次分享我们就来谈谈单例模式的使用,其实在本公众号设计模式的第一篇分享就是单例模式,为什么又要讨论单例模式了?主要是那篇文章谈的比较浅,只对单例模式的主要思想做了一个分享,这篇文章会从多个方面去分享单例模式的使用,下面进入正题。 使用Java做程序的小伙伴都知道单例,尤其是使用spring框架做项目的,大家都知道spring框架管理类默认都是单例模式的,并且是线程安全的。那么如果保证一个类只被初始化一次且线程安全了?带着这个问题我们开始这篇文章。 在刚接触设计模式的时候,大多数人首先接触到的第一个设计模式就是单例模式,当然大多数人都只停留在单例模式,在平时的开发中用的少之又少,这篇文章会帮助大家从多个方面理解单例模式,此文代码较多,如果对单例模式概念不是很清楚的小伙伴可以看另一篇文章《设计模式之单例模式》。 1. 懒汉模式 package com.study.concurrency.base_concurrency.example.singleton; /** * <p>Title: Singleton01</p > * <p>Description: 懒汉模式 单例实例在第一次使用时进行创建 </p > * <p>Company: http://www.yinjiedu.com</p > * <p>Project: concurrency</p > * * @author:

单例模式

假如想象 提交于 2019-11-28 08:15:15
使用 __new__ 方法 class Singleton ( object ) : def __new__ ( cls , * args , ** kwargs ) : if not hasattr ( cls , '_instance' ) : bef = super ( Singleton , cls ) cls . _instance = bef . __new__ ( cls , * args , ** kwargs ) return cls . _instance class sClass ( Singleton ) : a = 1 共享属性 class Singleton ( object ) : _state = { } def __new__ ( cls , * args , ** kwargs ) : bef = super ( Singleton , cls ) . __new__ ( cls , * args , ** kwargs ) bef . __dict__ = cls . _state # 创建实例时把所有实例的`__dict__`指向同一个字典 return bef class sClass ( Singleton ) : a = 1 装饰器版本 def Singleton ( cls , * args , ** kwargs ) :

设计模式 - 由浅入深分析单例模式

谁都会走 提交于 2019-11-28 07:49:53
单例模式(Singleton Patten):确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例(Ensure a class has only one instance, and provide a global point of access to it)。 Singleton类称为单例类,通过使用private的构造函数确保了在一个应用中只产生一个实例,并且是自行实例化的(在Singleton中自己使用new Singleton())。 1.单例入门 饿汉式: 在类加载时就创建对象实例,而不管实际是否需要创建。 public class Singleton { private static final Singleton singleton = new Singleton(); private Singleton() { } public static Singleton getInstance() { return singleton; } } 懒汉式: 只有调用getInstance的时候,才实例化对象。 public class Singleton { private static Singleton singleton; private Singleton() { } public static Singleton getInstance() { if