做者:小傅哥
博客:https://bugstack.cnhtml
沉淀、分享、成长,让本身和他人都能有所收获!😄
5个建立型模式的最后一个
java
在设计模式中按照不一样的处理方式共包含三大类;建立型模式、结构型模式和行为模式,其中建立型模式目前已经介绍了其中的四个;工厂方法模式
、抽象工厂模式
、生成器模式
和原型模式
,除此以外还有最后一个单例模式
。git
掌握了的知识才是本身的
程序员
在本次编写的重学 Java 设计模式的编写中尽量多的用各类场景案例还介绍设计的使用,包括咱们已经使用过的场景;各类类型奖品发放
、多套Redis缓存集群升级
、装修公司报价清单
和百份考卷题目与答案乱序
,经过这些场景案例的实践感觉设计模式的思想。但这些场景都是做者经过经验分离出来的,还并非读者的知识,因此你若是但愿能够融会贯通的掌握那么必定要亲力亲为的操做,事必躬亲的完成。github
书不是看的是用的
面试
在这里仍是想强调一下学习方法,总有不少小伙伴对学习知识有疑惑,明明看了、看的时候也懂了,但到了实际使用的时候却用不上。或者有时候在想是不要是有更加生动的漫画或者什么对比会好些,固然这些方式可能会加快一个新人对知识的理解速度。但只要你把学习视频当电影看、学习书籍当故事看,就很难掌握这项技术栈。只有你把它用起来,逐字逐句的深挖,一点点的探求,把各项遇到的盲点所有扫清,才能让你真的掌握这项技能。算法
bugstack虫洞栈
,回复源码下载
获取(打开获取的连接,找到序号18)单例模式能够说是整个设计中最简单的模式之一,并且这种方式即便在没有看设计模式相关资料也会经常使用在编码开发中。spring
由于在编程开发中常常会遇到这样一种场景,那就是须要保证一个类只有一个实例哪怕多线程同时访问,并须要提供一个全局访问此实例的点。数据库
综上以及咱们日常的开发中,能够总结一条经验,单例模式主要解决的是,一个全局使用的类频繁的建立和消费,从而提高提高总体的代码的性能。编程
本章节的技术所出现的场景很是简单也是咱们平常开发所能见到的,例如;
在咱们的平常开发中大体上会出现如上这些场景中使用到单例模式,虽然单例模式并不复杂可是使用面却比较广。
单例模式的实现方式比较多,主要在实现上是否支持懒汉模式、是否线程安全中运用各项技巧。固然也有一些场景不须要考虑懒加载也就是懒汉模式的状况,会直接使用static
静态类或属性和方法的方式进行处理,供外部调用。
那么接下来咱们就经过实现不一样方式的实现进行讲解单例模式。
public class Singleton_00 { public static Map<String,String> cache = new ConcurrentHashMap<String, String>(); }
public class Singleton_01 { private static Singleton_01 instance; private Singleton_01() { } public static Singleton_01 getInstance(){ if (null != instance) return instance; return new Singleton_01(); } }
new Singleton_01()
,所以这里在默认的构造函数上添加了私有属性 private
。public class Singleton_02 { private static Singleton_02 instance; private Singleton_02() { } public static synchronized Singleton_02 getInstance(){ if (null != instance) return instance; return new Singleton_02(); } }
public class Singleton_03 { private static Singleton_03 instance = new Singleton_03(); private Singleton_03() { } public static Singleton_03 getInstance() { return instance; } }
Map
基本一致,在程序启动的时候直接运行加载,后续有外部须要使用的时候获取便可。public class Singleton_04 { private static class SingletonHolder { private static Singleton_04 instance = new Singleton_04(); } private Singleton_04() { } public static Singleton_04 getInstance() { return SingletonHolder.instance; } }
public class Singleton_05 { private static Singleton_05 instance; private Singleton_05() { } public static Singleton_05 getInstance(){ if(null != instance) return instance; synchronized (Singleton_05.class){ if (null == instance){ instance = new Singleton_05(); } } return instance; } }
public class Singleton_06 { private static final AtomicReference<Singleton_06> INSTANCE = new AtomicReference<Singleton_06>(); private static Singleton_06 instance; private Singleton_06() { } public static final Singleton_06 getInstance() { for (; ; ) { Singleton_06 instance = INSTANCE.get(); if (null != instance) return instance; INSTANCE.compareAndSet(null, new Singleton_06()); return INSTANCE.get(); } } public static void main(String[] args) { System.out.println(Singleton_06.getInstance()); // org.itstack.demo.design.Singleton_06@2b193f2d System.out.println(Singleton_06.getInstance()); // org.itstack.demo.design.Singleton_06@2b193f2d } }
AtomicInteger
、AtomicBoolean
、AtomicLong
、AtomicReference
。public enum Singleton_07 { INSTANCE; public void test(){ System.out.println("hi~"); } }
约书亚·布洛克(英语:Joshua J. Bloch,1961年8月28日-),美国著名程序员。他为Java平台设计并实做了许多的功能,曾担任Google的首席Java架构师(Chief Java Architect)。
调用方式
@Test public void test() { Singleton_07.INSTANCE.test();
这种写法在功能上与共有域方法相近,可是它更简洁,无偿地提供了串行化机制,绝对防止对此实例化,即便是在面对复杂的串行化或者反射攻击的时候。虽然这中方法尚未普遍采用,可是单元素的枚举类型已经成为实现Singleton的最佳方法。
但也要知道此种方式在存在继承场景下是不可用的。
Effective Java
一书也很是建议你们阅读。另外推荐下这位大神的Github:https://github.com/jbloch