• 创建型模式:

– 单例模式、工厂模式、抽象工厂模式、建造者模式、原型模式。

• 结构型模式:

– 适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模

式。

• 行为型模式:

– 模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模

式、解释器模式、状态模式、策略模式、职责链模式、访问者模式。

• 常见的五种单例模式实现方式

– 主要:

• 饿汉式(线程安全,调用效率高。 但是,不能延时加载。)

• 懒汉式(线程安全,调用效率不高。 但是,可以延时加载。)

– 其他:

• 双重检测锁式(由于JVM底层内部模型原因,偶尔会出问题。不建议使用)

• 静态内部类式(线程安全,调用效率高。 但是,可以延时加载)

• 枚举式(线程安全,调用效率高,不能延时加载。并且可以天然的防止反射和反序列

化漏洞!)

• 如何选用?

– 单例对象 占用 资源 少,不需要 延时加载:

• 枚举式 好于 饿汉式

– 单例对象 占用 资源 大,需要 延时加载:

• 静态内部类式 好于 懒汉式

一:单例模式

1.1 饿汉式

/**

  • 测试饿汉式单例模式

    */

    public class SingletonDemo1 {

    //类初始化时,立即加载这个对象(没有延时加载的优势)。加载类时,天然的是线程安全的!

    private static SingletonDemo1 instance = new SingletonDemo1();

    private SingletonDemo1(){

    }

    //方法没有同步,调用效率高!

    public static SingletonDemo1 getInstance(){

    return instance;

    }

}

1.2 懒汉式

/**

  • 测试懒汉式单例模式

    */

    public class SingletonDemo2 {

    //类初始化时,不初始化这个对象(延时加载,真正用的时候再创建)。

    private static SingletonDemo2 instance;

    private SingletonDemo2(){ //私有化构造器

    }

    //方法同步,调用效率低!

    public static synchronized SingletonDemo2 getInstance(){

    if(instance==null){

    instance = new SingletonDemo2();

    }

    return instance;

    }

}

1.3 双重检查锁单例模式

/**

  • 双重检查锁实现单例模式

    */

    public class SingletonDemo3 {

private static SingletonDemo3 instance = null;

public static SingletonDemo3 getInstance() {

if (instance == null) {

SingletonDemo3 sc;

synchronized (SingletonDemo3.class) {

sc = instance;

if (sc == null) {

synchronized (SingletonDemo3.class) {

if(sc == null) {

sc = new SingletonDemo3();

}

}

instance = sc;

}

}

}

return instance;

}

private SingletonDemo3() {

}

}

1.4 静态内部类实现单例模式

/**

  • 测试静态内部类实现单例模式
  • 这种方式:线程安全,调用效率高,并且实现了延时加载!

*/

public class SingletonDemo4 {

private static class SingletonClassInstance {
private static final SingletonDemo4 instance = new SingletonDemo4();
} private SingletonDemo4(){
} //方法没有同步,调用效率高!
public static SingletonDemo4 getInstance(){
return SingletonClassInstance.instance;
}

}

1.5 枚举式

/**

  • 测试枚举式实现单例模式(没有延时加载)

*/

public enum SingletonDemo5 {

//这个枚举元素,本身就是单例对象!
INSTANCE; //添加自己需要的操作!
public void singletonOperation(){

}

}

1.6 懒汉式单例模式(如何防止反射和反序列化漏洞)

/**

  • 测试懒汉式单例模式(如何防止反射和反序列化漏洞)

*/

public class SingletonDemo6 implements Serializable {

//类初始化时,不初始化这个对象(延时加载,真正用的时候再创建)。

private static SingletonDemo6 instance;

private SingletonDemo6(){ //私有化构造器
if(instance!=null){
throw new RuntimeException();
}
} //方法同步,调用效率低!
public static synchronized SingletonDemo6 getInstance(){
if(instance==null){
instance = new SingletonDemo6();
}
return instance;
} //反序列化时,如果定义了readResolve()则直接返回此方法指定的对象。而不需要单独再创建新对象!
private Object readResolve() throws ObjectStreamException {
return instance;
}

}

破解单例模式(一般情况下可以破解,除了枚举单例模式和添加了安全措施的单例模式,也就是上面的代码)

用反射和序列化

/**

  • 测试反射和反序列化破解单例模式

*/

public class Client2 {

public static void main(String[] args) throws Exception {
SingletonDemo6 s1 = SingletonDemo6.getInstance();
SingletonDemo6 s2 = SingletonDemo6.getInstance(); System.out.println(s1);
System.out.println(s2); //通过反射的方式直接调用私有构造器

// Class clazz = (Class) Class.forName("com.bjsxt.singleton.SingletonDemo6");

// Constructor c = clazz.getDeclaredConstructor(null);

// c.setAccessible(true);

// SingletonDemo6 s3 = c.newInstance();

// SingletonDemo6 s4 = c.newInstance();

// System.out.println(s3);

// System.out.println(s4);

	//通过反序列化的方式构造多个对象
FileOutputStream fos = new FileOutputStream("d:/a.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(s1);
oos.close();
fos.close(); ObjectInputStream ois = new ObjectInputStream(new FileInputStream("d:/a.txt"));
SingletonDemo6 s3 = (SingletonDemo6) ois.readObject();
System.out.println(s3); }

}

GOF 23种设计模式-单例模式的更多相关文章

  1. GOF 23种设计模式目录

    经典的gof 23种设计模式,目录大纲查看. 1. Singleton(单例模式) 保证一个类只有一个实例,并提供访问它的全局访问点. 2. Abstract Factory(抽象工厂模式) 提供一个 ...

  2. GoF 23种设计模式概述

    本文的结构: 一.设计模式总览 二.创建型设计模式 Creational Patterns 三.结构型设计模式 Structural Patterns 四.行为型设计模式 Behavioral Pat ...

  3. GOF 23种设计模式

    设计模式目录 创建型 1. Factory Method(工厂方法) 2. Abstract Factory(抽象工厂) 3. Builder(建造者) 4. Prototype(原型) 5. Sin ...

  4. 23种设计模式--单例模式-Singleton

    一.单例模式的介绍 单例模式简单说就是掌握系统的至高点,在程序中只实例化一次,这样就是单例模式,在系统比如说你是该系统的登录的第多少人,还有数据库的连接池等地方会使用,单例模式是最简单,最常用的模式之 ...

  5. 实践GoF的23种设计模式:SOLID原则(上)

    摘要:本文以我们日常开发中经常碰到的一些技术/问题/场景作为切入点,示范如何运用设计模式来完成相关的实现. 本文分享自华为云社区<实践GoF的23种设计模式:SOLID原则(上)>,作者: ...

  6. 实践GoF的23种设计模式:观察者模式

    摘要:当你需要监听某个状态的变更,且在状态变更时通知到监听者,用观察者模式吧. 本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:观察者模式>,作者: 元闰子 . 简介 现在有 ...

  7. java设计模式:概述与GoF的23种设计模式

    软件设计模式的产生背景 设计模式这个术语最初并不是出现在软件设计中,而是被用于建筑领域的设计中. 1977 年,美国著名建筑大师.加利福尼亚大学伯克利分校环境结构中心主任克里斯托夫·亚历山大(Chri ...

  8. 【设计模式】GOF设计模式趣解(23种设计模式)

    创建型模式                   1.FACTORY—追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说 ...

  9. 2.GoF 的 23 种设计模式的分类和功能

    1. 根据目的来分 根据模式是用来完成什么工作来划分,这种方式可分为创建型模式.结构型模式和行为型模式 3 种. 创建型模式:用于描述“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”.GoF ...

随机推荐

  1. python for data analysis chapter1~2

    Q1:numpy与series的区别:index Tab补全(任意路径Tab) 内省(函数:?显示文档字符串,??显示源代码:结合通配符:np.* load *?) %load .py ctrl-c( ...

  2. UOJ 152 汉诺塔 分治

    题目链接 题意: 有三根编号为\((1, \, 2, \, 3)\)的柱子,然后第一根柱子上有编号为\(1 \sim n(n \leq 10000)\)的盘子,从上到下第\(i\)个盘子的编号是\(A ...

  3. 如何在官网下载Spring jar包

    该链接里面讲的很仔细! http://blog.csdn.net/frankarmstrong/article/details/69808813

  4. GCC内嵌汇编一些限制字符串

    /******************/ “b”将输入变量放入ebx “c”将输入变量放入ecx “d”将输入变量放入edx “s”将输入变量放入esi “d”将输入变量放入edi “q”将输入变量放 ...

  5. 爬虫Scrapy框架-Crawlspider链接提取器与规则解析器

    Crawlspider 一:Crawlspider简介 CrawlSpider其实是Spider的一个子类,除了继承到Spider的特性和功能外,还派生除了其自己独有的更加强大的特性和功能.其中最显著 ...

  6. 紫书第三章训练1 E - DNA Consensus String

    DNA (Deoxyribonucleic Acid) is the molecule which contains the genetic instructions. It consists of ...

  7. C语言总结(2)

    1.函数printf(" ")可以输出双引号中任何固定不变的内容. 2.必须在程序前面加:预处理命令. 3.#include<stdio.h>后面不需要“:”,“:”. ...

  8. 【bzoj4016】[FJOI2014]最短路径树问题 堆优化Dijkstra+DFS树+树的点分治

    题目描述 给一个包含n个点,m条边的无向连通图.从顶点1出发,往其余所有点分别走一次并返回. 往某一个点走时,选择总长度最短的路径走.若有多条长度最短的路径,则选择经过的顶点序列字典序最小的那条路径( ...

  9. 【Luogu】P2604网络扩容(费用流乱搞)

    题目链接 这题比较水,就是乱改改费用流模板.判断一下已经满流的边和没有满流的边,然后再改改最大流模板,然后把它们拼起来就是了. 话说这题第一遍90,然后撕烤一会发现自己yy的spfa扩容方式不允许反悔 ...

  10. 都系坤坤-微信助手V 0.1,解放双手发信息

    端午节刚过,相信大家在端午节都收到不少微信祝福信息,有复制长篇大论的祝福语群发的,有人工手打的简单祝福群发,我更喜欢人工手打带上称呼的祝福信息,这样看起来更加亲切. 那么问题来了,当你的通讯录里好友多 ...