• 创建型模式:

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

• 结构型模式:

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

式。

• 行为型模式:

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

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

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

– 主要:

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

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

– 其他:

• 双重检测锁式(由于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. Monkey与MonkeyRunner之间的区别

    为了支持黑盒自动化测试的场景,Android SDK提供了monkey和monkeyrunner两个测试工具,这两个测试工具除了名字类似外,还都可以向待测应用发送按键等消息,往往容易产生混淆,以下是他 ...

  2. js中xml文件加载

  3. python面试题解析(数据库和缓存)

    1.     答: 关系型数据库:Mysql,Oracel,Microsoft SQL Server 非关系型数据库:MongoDB,memcache,Redis. 2.     答:     MyI ...

  4. 转:GridView中RowDataBound的取值

    GridView是ASP.NET中功能强大的数据显示控件,它的RowDataBound事件为我们提供了方便的控制行.列数据的途径. 要获取当前行的某个数据列,我在实践中总结有如下几种方法: 1. Ce ...

  5. TransH中的Hinge Loss Function

    Hinge Loss Function Hinge Loss 函数一种目标函数,有时也叫max-margin objective. 在Trans系列中,有一个 \[ \max(0,f(h,r,t) + ...

  6. angular2 通过指令限制输入

    最近在写一个表单,有些输入框只能输入数字,单又不想每次写表单的时候,都要去验证输入的是不是数字, 那么就想到直接限制只能输入数字,通过指令实现 这里需要注意的是,不只更改DOM的值,如果input为数 ...

  7. java异常处理及400,404,500错误处理

        java代码中经常碰到各种需要处理异常的时候,比如什么IOException  SQLException  NullPointException等等,在开发web项目中,遇到异常,我现在做的就 ...

  8. Hadoop High Availability

    Hadoop High Availability HA(High Available), 高可用,是保证业务连续性的有效解决方案, 通常通过设置备用节点的方式实现; 一般分为执行业务的称为活动节点(A ...

  9. 模型表单ModleForm

    官方文档网址   http://python.usyiyi.cn/documents/django_182/topics/forms/modelforms.html 模型表单的应用场景 如果你正在构建 ...

  10. C语言实验设计

    一.实验题目,设计思路,实现方法 7-4 计算分段函数[2](10 分) 本题目要求计算下列分段函数f(x)的值: 注:可在头文件中包含math.h,并调用sqrt函数求平方根,调用pow函数求幂. ...