• 创建型模式:

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

• 结构型模式:

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

式。

• 行为型模式:

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

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

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

– 主要:

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

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

– 其他:

• 双重检测锁式(由于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. hdu2604 递推转换矩阵快速幂

    刚开始还以为用位运算与或几下几个循环就搞定了,算着算着发现不行........ 还是一种固定的切题角度,我假设有长度为n,总的排列数位f(n),怎么算他呢?从后往前考虑,因为大多数情况,都是用前面的结 ...

  2. 1512 Monkey King

    Monkey King Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tota ...

  3. Java学习笔记2---设置环境变量JAVA_HOME,CLASSPATH,PATH

    1.环境变量包括: JAVA_HOME,CLASSPATH,PATH 2.设置环境变量的目的: 路径搜索,方便查找到jdk的安装路径.方便搜索用到的类文件.方便搜索用到的可执行文件如java,java ...

  4. Leetcode17--->Letter Combinations of a Phone Number(电话号码对应的字母的组合)

    题目: 给定一个数字字符串,返回数字所能代表的所有字母组合: 举例: Input:Digit string "23" Output: ["ad", " ...

  5. mysql 索引和查询优化

    对于任何DBMS,索引都是进行优化的最主要的因素.对于少量的数据,没有合适的索引影响不是很大,但是,当随着数据量的增加,性能会急剧下降.如果对多列进行索引(组合索引),列的顺序非常重要,MySQL仅能 ...

  6. python学习-- Django传递数据给JS

    var List = {{ List|safe }};//safe 必须存在

  7. c中#与##的应用思考

    c中#与##的应用思考 原创 2014年02月25日 22:01:35 927 一. 思考出处 在读<<linux 0.12完全剖析>>初始化部分, init进程是通过fork ...

  8. python闭包函数、装饰器

    闭包函数的传值方式: 方式1:通过参数传值 def func(x): print(x)func(1) 方式2:闭包函数传值 def outter(x): def inner(): print(x) r ...

  9. Welcome-to-Swift-24高级运算符(Advanced Operators)

    除了基本操作符中所讲的运算符,Swift还有许多复杂的高级运算符,包括了C语和Objective-C中的位运算符和移位运算. 不同于C语言中的数值计算,Swift的数值计算默认是不可溢出的.溢出行为会 ...

  10. Editplus注册码,汉化官方版本

    官方认证Edit+简体中文版 https://www.editplus.com/download.html EditPlus注册码在线生成 http://www.jb51.net/tools/edit ...