• 创建型模式:

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

• 结构型模式:

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

式。

• 行为型模式:

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

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

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

– 主要:

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

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

– 其他:

• 双重检测锁式(由于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. java服务器备份(复制)

    public ResponseResult serverBackup (String[] datypeid)throws IOException{ ResponseResult rr = new Re ...

  2. HDU 2460 Network 边双连通分量 缩点

    题意: 给出一个无向连通图,有\(m\)次操作,每次在\(u, v\)之间加一条边,并输出此时图中桥的个数. 分析: 先找出边双连通分量然后缩点得到一棵树,树上的每条边都输原图中的桥,因此此时桥的个数 ...

  3. HDU 5396 区间DP 数学 Expression

    题意:有n个数字,n-1个运算符,每个运算符的顺序可以任意,因此一共有 (n - 1)! 种运算顺序,得到 (n - 1)! 个运算结果,然后求这些运算结果之和 MOD 1e9+7. 分析: 类比最优 ...

  4. PHP模版引擎twig wordpress中调用文章第一张图片

    wordpress当文章没有添加Featured media的时候, 就调用文章第一张图片, 调用的wordpress代码函数为: <?php echo catch_that_image(); ...

  5. Python爬虫selenium、PhanmJs

    selenium:可以模拟鼠标进行一些操作 实例1:实现自动打开google浏览器,进行百度搜索,并关闭浏览器 from selenium import webdriver from time imp ...

  6. iOS----精品开源库-开发强力助攻

    30个精品iOS开源库,超强助攻 你不会想错过他们,真的. 我爱开源.  文章的尾部你会看到一个太长不看的版本——一个简单的列表,只有标题和到项目的链接.如果你发现这篇文章是有用的,把它和你的iOS开 ...

  7. 【Luogu】P4363一双木棋(状压爆搜)

    题目链接 唉,只有AC了这道题才会感叹考场上没有想出解法的我是多么智障. 我甚至连任何想法都没有. 天啊我当时到底在想些什么. AC这道题我就能进前15了诶. 我们发现只要确定了轮廓线那么此时的状态就 ...

  8. html 文本标签

    文本格式化标签 标签 描述 <b> 定义粗体文本. <big> 定义大号字. <em> 定义着重文字. <i> 定义斜体字. <small> ...

  9. [luoguP2774] 方格取数问题(最大点权独立集)

    传送门 引入两个概念: 最小点权覆盖集:满足每一条边的两个端点至少选一个的最小权点集. 最大点权独立集:满足每一条边的两个端点最多选一个的最大权点集. 现在对网格染色,使得相邻两点颜色不同,之后把两个 ...

  10. [NOIP2009] $Hankson$ 的趣味题 (数论,gcd)

    题目链接 Solution 此题,用到的结论都是比较浅显的,但是,我竟然没想到反过来枚举... 只有50分... 被自己蠢哭... 结论比较浅显: 1.对于两个正整数\(a\),\(b\),设 \(g ...