CS-Notes/interview/java/设计模式.md

93 lines
2.8 KiB
Markdown
Raw Normal View History

2018-08-28 21:10:16 +08:00
<!-- 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类型来决定到底生产哪种具体的产品类
![](img/简单工厂模式.png)
## 工厂方法
目的:工厂方法把类的实例化操作放到子类来执行,本身抽象化。
类图:在简单工厂中,创建对象的是另一个类,而在工厂方法中,是由子类来创建对象。
![](img/工厂方法.png)
## 抽象工厂模式
目的: 抽象工厂模式使用抽象工厂类来产生多个具体的工厂由具体的工厂来生产各自的产品最终关联到抽象产品类中client通过抽象工厂来生产具体的产品。
![](/pics/8668a3e1-c9c7-4fcb-98b2-a96a5d841579.png)
## 建造者(生成器)模式