单例模式

java 懒汉式、饿汉式单例模式 不含多线程的情况

对着背影说爱祢 提交于 2019-12-11 12:15:46
//饿汉式 提前生成了单例对象 class Singleton{ private static final Singleton instance=new Singleton(); private Singleton(){} public static Singleton getInstance(){ return instance; } } //懒汉式 调用的时候才会生成对象 class Singleton11 { private static Singleton11 instance; private Singleton11(){} public static Singleton11 getInstance(){ if (instance==null) { instance=new Singleton11(); } return instance; } } //多例模式 class Color { private static final Color Red=new Color("红色"); private static final Color Green=new Color("绿色"); private static final Color Blue=new Color("蓝色"); private String color; private Color(String

单例的注意事项,应用场景(仅作本人记录使用)

☆樱花仙子☆ 提交于 2019-12-11 11:51:09
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 单例模式介绍: 单例模式(Singleton),也叫单子模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个全局对象,这样有利于我们协调系统整体的行为。 比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。 单例模式实现思路: 一个类能返回对象一个引用(永远是同一个)和一个获得该实例的方法(必须是静态方法,通常使用getInstance这个名称); 调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用; 将该类的构造函数定义为私有方法,这样其他处的代码就无法通过调用该类的构造函数来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例。 需要注意的地方: 单例模式在多线程的,应用场合下必须小心使用。如果当唯一实例尚未创建时,有两个线程同时调用创建方法,那么它们同时没有检测到唯一实例的存在,从而同时各自创建了一个实例,这样就有两个实例被构造出来,从而违反了单例模式中实例唯一的原则。

单例模式Singleton(创建模式)

一曲冷凌霜 提交于 2019-12-11 10:06:15
定义: Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。 在很多操作中,比如建立目录 数据库连接都需要这样的单线程操作。 还有, singleton能够被状态化; 这样,多个单态类在一起就可以作为一个状态仓库一样向外提供服务,比如,你要论坛中的帖子计数器,每次浏览一次需要计数,单态类能否保持住这个计数,并且能synchronize的安全自动加1,如果你要把这个数字永久保存到数据库,你可以在不修改单态接口的情况下方便的做到。 另外方面,Singleton也能够被无状态化。提供工具性质的功能, Singleton模式就为我们提供了这样实现的可能。使用Singleton的好处还在于可以节省内存,因为它限制了实例的个数,有利于Java垃圾回收(garbage collection)。 我们常常看到工厂模式中类装入器(class loader)中也用Singleton模式实现的,因为被装入的类实际也属于资源。 单例模式的两种代码体现形式 饱汉式 // 定义一个私有构造器,这样的话就不能通过new关键字在外部所实例化 private Singleton(){} // 在jvm中创建该类的一个实例 private static Singleton singleton = new Singleton(); // 在外部通过调用此方法

单例模式

ぐ巨炮叔叔 提交于 2019-12-10 22:45:43
定义: 单例模式 (Singleton Pattern)属于创建型模式,提供了一种创建对象的最佳方式。 单例模式保证一个类仅有一个实例,并提供一个访问它的全局访问点 实现方式 :“饿汉式” and “懒汉式”    “饿汉式” :在类加载的时候就实例化对象,通俗来说就是:不管这个对象你要不要用,我都先实例化出来,要用的时候直接取就行 “懒汉式” :也就是我们常说的 延迟加载 。通俗来说就是:只要你要用这个对象,我才去实例化这个对象,然后在取来用 通过定义我们就知道这两种方式的差异了,“饿汉式”在不采取同步的方式的时候就是线程安全的,而“懒汉汉”则需要采取同步的措施来保证线程安全,当然也可以不采取同步的措施,例如采用枚举类来实现单例模式,这个接下来细说。 优点:    1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例。 2、避免对资源的多重占用(比如写文件操作)。 缺点: 没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。 具体实现 : 也就是上代码啦!!! 1、“饿汉式” 1 // 饿汉式 demo1 2 public class Singleton1 { 3 4 // 必须私有化构造函数 5 private Singleton1(){} 6 7 // 先初始化对象 8 private static

JavaScript设计模式之单例模式

China☆狼群 提交于 2019-12-10 20:48:20
  单例模式在前端开发中,有着广泛的应用场景,像前端缓存、页面模态框的创建等,只需要初始化一次,后面直接取之前的实例就好了。通俗来说,单例模式就是 保证全局仅有一个实例,并且能够全局访问 ,核心就是这两点。 const Singleton = function (name) { this.name = name }; Singleton.prototype.getName = function () { console.log(this.name) }; Singleton.getInstance = (function () { let instance = null; return function (name) { if (!instance) { instance = new Singleton(name) } return instance } })();   在JavaScript中,实现一个全局变量,最简单的就是声明一个全局变量,但是会容易造成变量污染,不建议使用。采用闭包封装私有变量,是一个不错的选择。如上述代码所示,在构造方法上声明一个获取实例的方法,声明一个私有变量,返回的方法中保存中对私有变量的引用,利用闭包,就能够一直保持每次获取的值是一样的。   单例模式还有一个比较有用的地方就是在我们给DOM元素绑定事件时,如果只想绑定一次,防止重复绑定,那么此时

单例模式

主宰稳场 提交于 2019-12-10 16:44:19
懒汉式 ( 双重锁定 ) public class Singleton { private volatile static Singleton singleton;//第一步检查 public static Singleton getInstance() { if (singleton == null) {//第二步检查 synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); } } } return singleton; } } 饿汉式(先创建出实例) class Singleton{ //静态实例 private static Singleton singleton = new Singleton(); //构造函数 private Singleton(){}; public Singleton getInstance(){ return singleton; } } 枚举 enum Singleton{ INSTANCE; //枚举成员 private Singleton singleton; private Singleton{ singleton = new Singleton(); } public Singleton getInstance(){

单例模式(详解)

笑着哭i 提交于 2019-12-10 12:42:11
1.单例模式的应用场景 单例模式(Singleton Pattern)是指确保一个类在任何情况下都绝对只有一个实例,并提供一个全局访问点。单例模式是创建型模式。单例模式在现实生活中应用也非常广泛。 例如,国家主席、公司 CEO、部门经理等。在 J2EE 标准中,ServletContext、ServletContextConfig 等;在 Spring 框架应用中 ApplicationContext;数据库的连接 池也都是单例形式。 2.饿汉式模式 先来看单例模式的类结构图: 饿汉式单例是在类加载的时候就立即初始化,并且创建单例对象。绝对线程安全,在线程还没出现以前就是实例化了,不可能存在访问安全问题。 优点 :没有加任何的锁、执行效率比较高,在用户体验上来说,比懒汉式更好。 缺点 :类加载的时候就初始化,不管用与不用都占着空间,浪费了内存,有可能占着茅坑不拉屎。 Spring 中 IOC 容器 ApplicationContext 本身就是典型的饿汉式单例。接下来看一段代码: public class HungrySingleton { //先静态、后动态 //先属性、后方法 //先上后下 private static final HungrySingleton hungrySingleton = new HungrySingleton ( ) ; private

java 中的几种单例模式形式

和自甴很熟 提交于 2019-12-10 11:06:35
java 中的几种单例模式形式 1、饿汉单例形式 2、懒汉单例(线程不安全) 3、懒汉单例(对方法加锁) 4、懒汉单例(双重检测) 此方法还是存在问题,new 一个对象一共有三步 1、为对象分配内存空间 2、调用对象的构造函数,并对对象进行属性赋值 3、将对象指向分配的内存 jvm会对这三条指令进行重排,当将2、3进行了重排时,线程1先执行的指令3,然后执行指令2, 此时,cup切换到线程2执行,此时它判断instance不为空,返回,对象没有完成创建 改进的方法是加上volatile 5、懒汉单例(双重检测改进) 6、静态内部类单例 7、枚举单例形式 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: 全新的界面设计 ,将会带来全新的写作体验; 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示; 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示; 全新的 KaTeX数学公式 语法; 增加了支持

java单例模式

*爱你&永不变心* 提交于 2019-12-10 10:52:16
单例模式分为两种:饿汉模式 懒汉模式 饿汉模式: //单例模式:饿汉模式 public class TestSingleton { //1、私有化构造 private TestSingleton(){ } //2、私有静态属性对象实例 private static final TestSingleton singleton=new TestSingleton(); //3、公开获取实例方法 public static TestSingleton getTestObject() { return singleton; } } 饿汉模式 懒汉模式: //单例模式:懒汉模式 class TestSingleton{ //1、私有化构造 private TestSingleton(){ } //2、私有静态属性唯一对象引用 private static TestSingleton singleton; //3、公开获取实例方法(懒汉模式有个缺点在多线程时候可能创建多个对象) public static TestSingleton getTestObject() { if(singleton==null) { singleton=new TestSingleton(); } return singleton; } } 懒汉模式 恶汉模式在开启多线程的时候有可能出现创建多个对象的问题

工厂方法模式的扩展(二):替代单例模式 & 产品对象重复使用

时光总嘲笑我的痴心妄想 提交于 2019-12-10 09:09:15
工厂方法模式的扩展(二):替代单例模式 & 产品对象重复使用 这篇博客介绍下工厂方法模式的另外两种扩展:代替单例模式以及产品对象重复使用。 这两种扩展体现了一种思想:经常使用或全局共享以及必要情况下,没必要销毁对象 1. 代替单例模式 与其说代替单例模式,到不如所是用工厂模式实现单例模式。 对应代码如下:注意,构造器被私有化,工厂方法使用反射创建对象时要注意进行设置 public class Singleton { private Singleton(){} public void method(){ ... } } public class SingletonFactory { private static Singleton singleton; static{ try{ Class c = Class.forName(Singleton.class.getName()); Constructor constructor = c.getDeclaredConstructor(); constructor.setAccessible(true); singleton = (Singleton)constructor.newInstance(); } catch (Exception e){ } } public static Singleton getInstance(){