2.8 KiB
2.8 KiB
快速理解设计模式
设计模式主要分为3大类,分别是创建型模式、行为型模式和结构型模式。
创建型模式
创建型模式主要是和创建对象相关的一些设计模式
单例模式
目的:确保某个类在jvm中只有一个实例,提供该实例的全局访问点。
类图:使用一个私有构造函数、私有静态变量,和一个共有的静态函数来实现
懒汉式(线程不安全)、饿汉式、懒汉式(线程安全)
双重校验锁(注意volatile):
public class Singleton {
private volatile static Singleton uniqueInstance;
private Singleton() {
}
public static Singleton getUniqueInstance() {
if (uniqueInstance == null) {
synchronized (Singleton.class) {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}
为什么要使用volatile? uniqueInstance = new Singleton(); 这段代码其实是分三步执行:
- 分配内存空间
- 初始化对象
- 将 uniqueInstance 指向分配的内存地址
JVM的指令重排序可能导致执行顺序编程1-3-2, 在多线程情况下,可能获取一个没有初始化的实例,导致程序出错。
使用volatile 可以禁止JVM的指令重排序,保证多线程的环境下程序的正常运行。
静态内部类:
实现延迟加载,也能实现一次加载,线程安全、相当于同步的懒汉式
枚举类型:单例模式的最佳实践,实现简单,并且能在面对复杂的序列化或者反射攻击的时候,能够防止实例化多次。
简单工厂模式
目的:创建对象的时候隐藏内部细节,提供一个创建对象的通用接口。
类图:在简单工厂模式中,根据传入type类型来决定到底生产哪种具体的产品类
工厂方法
目的:工厂方法把类的实例化操作放到子类来执行,本身抽象化。
类图:在简单工厂中,创建对象的是另一个类,而在工厂方法中,是由子类来创建对象。
抽象工厂模式
目的: 抽象工厂模式使用抽象工厂类来产生多个具体的工厂,由具体的工厂来生产各自的产品,最终关联到抽象产品类中,client通过抽象工厂来生产具体的产品。