93 lines
2.8 KiB
Markdown
93 lines
2.8 KiB
Markdown
<!-- TOC -->
|
||
|
||
- [快速理解设计模式](#快速理解设计模式)
|
||
- [创建型模式](#创建型模式)
|
||
- [单例模式](#单例模式)
|
||
- [简单工厂模式](#简单工厂模式)
|
||
- [工厂方法](#工厂方法)
|
||
- [抽象工厂模式](#抽象工厂模式)
|
||
- [建造者(生成器)模式](#建造者生成器模式)
|
||
|
||
<!-- /TOC -->
|
||
|
||
# 快速理解设计模式
|
||
|
||
设计模式主要分为3大类,分别是创建型模式、行为型模式和结构型模式。
|
||
|
||
# 创建型模式
|
||
|
||
创建型模式主要是和创建对象相关的一些设计模式
|
||
|
||
## 单例模式
|
||
|
||
目的:确保某个类在jvm中只有一个实例,提供该实例的全局访问点。
|
||
|
||
类图:使用一个私有构造函数、私有静态变量,和一个共有的静态函数来实现
|
||
|
||
懒汉式(线程不安全)、饿汉式、懒汉式(线程安全)
|
||
|
||
双重校验锁(注意volatile):
|
||
|
||
``` java
|
||
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(); 这段代码其实是分三步执行:
|
||
|
||
1. 分配内存空间
|
||
2. 初始化对象
|
||
3. 将 uniqueInstance 指向分配的内存地址
|
||
|
||
JVM的指令重排序可能导致执行顺序编程1-3-2, 在多线程情况下,可能获取一个没有初始化的实例,导致程序出错。
|
||
|
||
使用volatile 可以禁止JVM的指令重排序,保证多线程的环境下程序的正常运行。
|
||
|
||
静态内部类:
|
||
|
||
实现延迟加载,也能实现一次加载,线程安全、相当于同步的懒汉式
|
||
|
||
枚举类型:单例模式的最佳实践,实现简单,并且能在面对复杂的序列化或者反射攻击的时候,能够防止实例化多次。
|
||
|
||
## 简单工厂模式
|
||
|
||
目的:创建对象的时候隐藏内部细节,提供一个创建对象的通用接口。
|
||
|
||
类图:在简单工厂模式中,根据传入type类型来决定到底生产哪种具体的产品类
|
||
|
||

|
||
|
||
## 工厂方法
|
||
|
||
目的:工厂方法把类的实例化操作放到子类来执行,本身抽象化。
|
||
|
||
类图:在简单工厂中,创建对象的是另一个类,而在工厂方法中,是由子类来创建对象。
|
||
|
||

|
||
|
||
## 抽象工厂模式
|
||
|
||
目的: 抽象工厂模式使用抽象工厂类来产生多个具体的工厂,由具体的工厂来生产各自的产品,最终关联到抽象产品类中,client通过抽象工厂来生产具体的产品。
|
||
|
||

|
||
|
||
## 建造者(生成器)模式
|
||
|