23种经典设计模式的深度解析
一个类应该只有一个引起它变化的原因
每个类只负责一项职责,降低类的复杂度
对扩展开放,对修改关闭
通过扩展来实现变化,而不是修改现有代码
子类必须能够替换其基类
继承关系中,子类不能改变父类的行为
客户端不应该依赖它不需要的接口
使用多个专门的接口比使用单一的总接口要好
高层模块不应该依赖低层模块
都应该依赖于抽象,抽象不应该依赖于细节
一个对象应该对其他对象有最少的了解
降低类之间的耦合度,提高模块的相对独立性
确保一个类只有一个实例,并提供全局访问点
全局配置信息管理
统一的日志输出管理
管理数据库连接资源
管理线程资源
延迟初始化,线程安全需要考虑
类加载时初始化,线程安全
性能优化的线程安全实现
最简洁的实现方式
创建对象的接口,让子类决定实例化哪个类
一个工厂类负责创建所有产品
每个产品对应一个工厂类
创建一系列相关的产品族
将复杂对象的构建过程与其表示分离
要构建的复杂产品
抽象建造者接口
具体建造者实现
指挥者,控制构建过程
对象有很多可选参数
动态构建复杂查询
系统配置参数设置
将一个类的接口转换成客户希望的另一个接口
使用组合关系
使用继承关系
适配不同的API接口
XML与JSON格式互转
新旧系统接口适配
统一数据库访问接口
动态地给对象添加一些额外的职责
通过包装对象来扩展功能
为其他对象提供一种代理以控制对这个对象的访问
控制访问权限
延迟加载对象
访问远程对象
缓存计算结果
定义对象间的一对多依赖关系,当一个对象状态改变时,所有依赖者都得到通知
被观察的对象,维护观察者列表
定义更新接口
具体主题实现
具体观察者实现
Model变化通知View更新
GUI事件处理机制
发布-订阅模式
数据变化自动更新UI
定义一系列算法,把它们一个个封装起来,并且使它们可相互替换
定义一个操作中的算法骨架,而将一些步骤延迟到子类中
定义算法骨架,final修饰
子类必须实现的方法
子类可选择性重写
已实现的通用方法
Spring、Hibernate等框架
ETL数据处理流程
JUnit测试生命周期
业务流程模板
public class EagerSingleton {
// 类加载时就创建实例
private static final EagerSingleton
INSTANCE = new EagerSingleton();
// 私有构造函数
private EagerSingleton() {}
// 获取实例的静态方法
public static EagerSingleton getInstance() {
return INSTANCE;
}
}
public class LazySingleton {
private static volatile LazySingleton instance;
private LazySingleton() {}
public static LazySingleton getInstance() {
if (instance == null) {
synchronized (LazySingleton.class) {
if (instance == null) {
instance = new LazySingleton();
}
}
}
return instance;
}
}
// 观察者接口
interface Observer {
void update(String message);
}
// 主题接口
interface Subject {
void addObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers();
}
public class NewsAgency implements Subject {
private List<Observer> observers = new ArrayList<>();
private String news;
public void addObserver(Observer observer) {
observers.add(observer);
}
public void removeObserver(Observer observer) {
observers.remove(observer);
}
public void notifyObservers() {
for (Observer observer : observers) {
observer.update(news);
}
}
public void setNews(String news) {
this.news = news;
notifyObservers();
}
}
public class NewsChannel implements Observer {
private String name;
public NewsChannel(String name) {
this.name = name;
}
@Override
public void update(String news) {
System.out.println(name + " 收到新闻: " + news);
}
}
// 使用示例
NewsAgency agency = new NewsAgency();
NewsChannel cnn = new NewsChannel("CNN");
NewsChannel bbc = new NewsChannel("BBC");
agency.addObserver(cnn);
agency.addObserver(bbc);
agency.setNews("重大新闻发布!");
// 产品接口
interface Shape {
void draw();
}
// 具体产品
class Circle implements Shape {
public void draw() {
System.out.println("绘制圆形");
}
}
class Rectangle implements Shape {
public void draw() {
System.out.println("绘制矩形");
}
}
// 简单工厂
class ShapeFactory {
public static Shape createShape(String type) {
switch (type) {
case "circle": return new Circle();
case "rectangle": return new Rectangle();
default: throw new IllegalArgumentException();
}
}
}
// 抽象工厂
interface GUIFactory {
Button createButton();
TextField createTextField();
}
// 具体工厂
class WindowsFactory implements GUIFactory {
public Button createButton() {
return new WindowsButton();
}
public TextField createTextField() {
return new WindowsTextField();
}
}
class MacFactory implements GUIFactory {
public Button createButton() {
return new MacButton();
}
public TextField createTextField() {
return new MacTextField();
}
}