目录
一、问题
1、谈谈你知道的设计模式(*2)?【第14讲】
类别 | 应用目标 | 例子 |
---|---|---|
创建型模式 | 对对象创建过程的各种问题和解决方案的总结 | 工厂模式、单例模式、构建器模式、原型模式 |
结构型模式 | 针对软件设计结构的总结,关注于类、对象继承、组合方式的实践经验 | 桥接模式、适配器模式、装饰者模式、代理模式、组合模式、外观模式、享元模式 |
行为型模式 | 从类或对象之间交互、职责划分等角度总结的模式 | 策略模式、解释器模式、命令模式、观察者模式、迭代器模式、模板方法模式、访问者模式 |
补充:
应用分类 | 中文 | 英文 |
---|---|---|
创建型模式 | 工厂模式 | Factory、Abstract Factory |
单例模式 | Singleton | |
构建器模式 | Builder | |
原型模式 | ProtoType | |
结构型模式 | 桥接模式 | Bridge |
适配器模式) | Adapter | |
装饰者模式 | Decorator | |
代理模式 | Proxy | |
组合模式 | Composite | |
外观模式 | Facade | |
享元模式 | Flyweight | |
行为型模式 | 策略模式 | Strategy |
解释器模式 | Interpreter | |
命令模式 | Command | |
观察者模式 | Observer | |
迭代器模式 | Iterator | |
、模板方法模式 | Template Method | |
访问者模式 | Visitor |
追问1:最常用哪种设计模式?
答:单例模式,工厂方法,抽象工厂,策略模式,观察者模式,代理模式……
2、单例模式是什么,请手动实现(*15)
1、含义:一个类只允许创建一个对象(或者叫实例),那这个类就是一个单例类。
2、经典实现方式
1、饿汉式:在类加载期间,就已经将 instance 静态实例初始化好了。
缺点:不支持延迟加载实例。
优点:符合 fail-fast 设计原则(有问题及早暴露),如果资源不够或启动报错(如 Java 中 PermGen Space OOM)可以立即修复。
public class IdGenerator {
private AtomicLong id = new AtomicLong(0);
private static final IdGenerator instance = new IdGenerator();
private IdGenerator() {}
public static IdGenerator getInstance() {
return instance;
}
public long getId() {
return id.incrementAndGet();
}
}
2、懒汉式
优势:相对于饿汉式,支持延迟加载。
缺陷:如果频繁用到会导致频繁加锁、释放锁,以及并发度低等问题,产生性能瓶颈。
public class IdGenerator {
private AtomicLong id = new AtomicLong(0);
private static IdGenerator instance;
private IdGenerator() {}
public static synchronized IdGenerator getInstance() {
if (instance == null) {
instance = new IdGenerator();
}
return instance;
}
public long getId() {
return id.incrementAndGet();
}
}
3、双重检测
优点:既支持延迟加载、又支持高并发的单例实现方式。只要 instance 被创建之后,再调用 getInstance() 函数都不会进入到加锁逻辑中。所以,这种实现方式解决了懒汉式并发度低的问题。
public class IdGenerator {
private AtomicLong id = new AtomicLong(0);
private static IdGenerator instance;
private IdGenerator() {}
public static IdGenerator getInstance() {
if (instance == null) {
synchronized(IdGenerator.class) { // 此处为类级别的锁
if (instance == null) {
instance = new IdGenerator();
}
}
}
return instance;
}
public long getId() {
return id.incrementAndGet();
}
}
4、静态内部类:用 Java 的静态内部类来实现单例。
优点:既支持延迟加载,也支持高并发。
public class IdGenerator {
private AtomicLong id = new AtomicLong(0);
private IdGenerator() {}
private static class SingletonHolder{
private static final IdGenerator instance = new IdGenerator();
}
public static IdGenerator getInstance() {
return SingletonHolder.instance;
}
public long getId() {
return id.incrementAndGet();
}
}
5、枚举
这种实现方式通过 Java 枚举类型本身的特性,保证了实例创建的线程安全性和实例的唯一性。
public enum IdGenerator {
INSTANCE;
private AtomicLong id = new AtomicLong(0);
public long getId() {
return id.incrementAndGet();
}
}
追问1:有哪些应用场景?
资源访问冲突、表示全局唯一类(配置信息类、唯一递增 ID 号码生成器)
3、Spring 等框架中使用了哪些模式?动态代理实现原理?
……
追问1:Spring 等框架中使用了哪些模式?动态代理实现原理?
……
二、……
三、参考
1、【设计模式】单例模式详解(一)
2、为什么使用枚举实现单例模式,有什么好处_@fall out boy的博客-程序员宅基地_单例模式枚举实现优势