文档章节

Java设计模式---单例模式

SEOwhywhy
 SEOwhywhy
发布于 2018/11/26 19:51
字数 900
阅读 0
收藏 0

  参考于 :
  
  大话设计模式
  
  java三百集---高淇
  
  讲在开头:如果需要懒加载,推荐使用静态内部类实现
  
  如果不需要懒加载,推荐使用枚举
  
  1.单例模式的概念
  
  保证一个类仅有一个实例,并提供一个访问它的全局访问点。
  
  你可能会想,我在创建对象的时候,先判断是不是null,不是null就直接获得,是null就创建实例。
  
  “生孩子还是不生孩子”应该是夫妻的责任,而不是我的责任。如果按照上面的想法,那么我就需要先判断一下才可以,这样“能不能生”就成了我的责任了哦。
  
  我们把“生一个孩子”的责任交给类,我们只需要去获得就完事了。
  
  2.第一种实现---饿汉式
  
  JVM加载类的时候先实例化了
  
  优点:JVM加载类是线程安全
  
  缺点:不能懒加载
  
  复制代码
  
  package com.dingyu;
  
  /**
  
  * 饿汉式单例模式 ,效率高
  
  * 线程安全,不需要synchronized关键字,但是不能懒加载
  
  * @author dingyu
  
  *
  
  */
  
  public class Singleton01 {
  
  private static Singleton01 instance = new Singleton01();
  
  private Singleton01() {
  
  }
  
  public static Singleton01 getSingleton() {
  
  return instance;
  
  }
  
  }
  
  复制代码
  
  3.第二种实现---懒汉式
  
  调用方法的时候再去创建实例
  
  优点:懒加载
  
  缺点:需要同步(不同步,如果线程a,线程b同时调用getSingleton(),相当于new了两次),效率不高
  
  复制代码
  
  package com.dingyu;
  
  /**
  
  * 懒汉式单例模式
  
  * 优点:懒加载
  
  * 缺点:需要同步
  
  * @author dingyu
  
  *
  
  */
  
  public class Singleton02 {
  
  private static Singleton02 instance = null;
  
  private Singleton02() {
  
  }
  
  private static synchronized Singleton02 getSingleton() {
  
  if (instance == null)
  
  instance = new Singleton02();
  
  return instance;
  
  }
  
  }
  
  复制代码
  
  4.第三种实现---双重锁定(尽量别用)
  
  如果第一次获得就加锁,创建。其他的时候就直接返回就可以。
  
  优点:效率高,可以懒加载
  
  缺点: JVM内部的原因会出现不可预知的错误(本人还没去了解原因,如果有知道的可以告诉我下,感谢)
  
  为什么要判断两次null,大话设计模式中解释了:如果线程a,线程b,通过突破了第一层null,线程a获得锁,线程b等着。a创建了个实例,释放锁,b获得锁,继续运行,如果没有第二层null,那么b仍然会创建一个实例,破坏单例模式。
  
  复制代码
  
  package com.dingyu;
  
  /**
  
  * 双重检测锁实现单例模式
  
  *
  
  * @author dingyu
  
  *
  
  */
  
  public class Singleton03 {
  
  private static www.dfgjpt.com/ Singleton03 instance = null;
  
  private Singleton03(www.gcyL157.com) {
  
  }
  
  public static Singleton03 getSingleton() {
  
  if (instance =www.mhylpt.com= null) {
  
  synchronized www.michenggw.com (Singleton03.class) {
  
  if (instance == null) {
  
  instance = new Singleton03();
  
  }
  
  }
  
  }
  
  return instance;
  
  }
  
  }
  
  复制代码
  
  5.第四种实现---静态内部类(推荐)
  
  静态内部类是你用到他的时候,他才会加载,而且加载类的时候是线程安全的,不需要同步
  
  优点:懒加载,效率高
  
  复制代码
  
  package com.dingyu;
  
  /**
  
  * 静态内部类实现单例模式
  
  * @author dingyu
  
  *
  
  */
  
  public class Singleton04 {
  
  private Singleton04() {
  
  }
  
  private static class SingletonInnerClass {
  
  private static Singleton04 instance = new Singleton04();
  
  }
  
  private static Singleton04 getSingleton() {
  
  return SingletonInnerClass.instance;
  
  }
  
  }
  
  复制代码
  
  6.第五种实现---枚举(推荐)
  
  枚举很特殊,JVM帮我们实现的单例,天然是单例的
  
  优点:效率高,反射破解不了
  
  缺点:不能懒加载
  
  复制代码
  
  package com.dingyu;
  
  /**
  
  * 枚举实现单例 枚举本来就是单例的
  
  *
  
  * @author dingyu
  
  *
  
  */
  
  public enum Singleton05 {
  
  INSTANCE;

© 著作权归作者所有

SEOwhywhy
粉丝 8
博文 155
码字总数 342404
作品 0
私信 提问
设计模式 2014-12-19

book: 阎宏《JAVA与模式》 架构设计栏目 http://blog.csdn.net/enterprise/column.html 概要: http://bbs.csdn.net/forums/Embeddeddriver 23种设计模式分别是: 1.单例模式 2.工厂方法模式...

jayronwang
2014/12/19
296
0
设计模式15——Template Method设计模式

Template Method模板方法设计模式定义一个操作中算法的骨架,将具体步骤的执行延迟到子类中实现。Java中的抽象类就是使用了模板方法设计模式。模板方法设计模式结构如下: 以文档处理为例,T...

小米米儿小
2014/01/24
218
0
简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别

转载:原地址http://www.cnblogs.com/zhangchenliang/p/3700820.html 简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别 结合简单示例和UML图,讲解工厂模式简单原理。 一、引子 话说...

法斗斗
2018/05/08
277
0
策略模式与SPI机制,到底有什么不同?

这里说的策略模式是一种设计模式,经常用于有多种分支情况的程序设计中。例如我们去掉水果皮,一般来说对于不同的水果,会有不同的拨皮方式。此时用程序语言来表示是这样的: 如上面代码所写...

陈树义
2018/09/03
0
0
学了那么多年设计模式依然不会用!那可真蠢!

什么是设计模式? 设计模式(Design Pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。 设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决...

GitChat技术杂谈
2018/10/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

idea修改新的git地址

我们在项目变动中通常会遇到更换git地址情况,这里介绍一个在idea项目中简单更换git地址操作: 1、点击VCS; 2、点击Git; 3、点击Remotes; 具体步骤如图 4、点击框中链接即可在右边看到一个...

west_coast
28分钟前
6
0
将规则集传递给mixin

允许包装在mixin中定义的css块。 分离的规则集是一组CSS属性、嵌套规则集、媒体声明或者是存储在变量中的任何其他内容,我们可以将它包含在规则集中或其他结构中,并且所有属性都将复制到那里...

凌兮洛
30分钟前
4
0
玩转阿里云 Terraform(一):Terraform 是什么

从本文起,我将陆续推出一系列有关 Terraform 的文章,从概念,特点,工作机制,用法以及最佳实践等多个方面由浅入深的向大家介绍如何在阿里云上玩转 Terraform。同时也希望借此机会,与感兴...

阿里云官方博客
30分钟前
4
0
科研大数据面临的挑战

近几十年硬件的发展非常迅猛,第一台Macintosh苹果电脑的内存是128KB(0.13MB),现在很多笔记本配的是8GB的内存,硬盘1TB(1024GB),2TB的很常见。大型的数据服务器上还会有更大的储容量,...

英论阁学术院
30分钟前
5
0
python学习10.09:Python列表和元组的底层实现

有关列表(list)和元组(tuple)的底层实现,本节分别从它们的源码来进行分析。 首先来分析 list 列表,它的具体结构如下所示: typedef struct { PyObject_VAR_HEAD /* Vector o...

太空堡垒185
31分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部