深入浅出23种设计模式
一、设计模式是啥?
设计模式就像编程的武功招式:
- 作用:解决特定场景下的代码设计问题
- 好处:代码更灵活、可维护、可扩展
- 分类:三大门派(创建型、结构型、行为型)
二、创建型模式(5种)
1. 单例模式(Singleton)
场景:全局唯一配置管理器
口诀:
"私有的构造,静态的实例,
对外提供访问点,全局只此一份"
public class Config {
private static Config instance;
private Config() {} // 私有构造
public static Config getInstance() {
if (instance == null) {
instance = new Config();
}
return instance;
}
}
2. 工厂方法(Factory Method)
场景:创建不同类型的数据库连接
口诀:
"定义创建接口,子类决定实例,
扩展只需新增,不用改原有代码"
interface Database {
void connect();
}
class MySQL implements Database { /*...*/ }
class Oracle implements Database { /*...*/ }
class DatabaseFactory {
public Database createDatabase(String type) {
switch(type) {
case "mysql": return new MySQL();
case "oracle": return new Oracle();
default: throw new IllegalArgumentException();
}
}
}
3. 抽象工厂(Abstract Factory)
场景:创建跨平台UI组件
口诀:
"工厂的工厂,产品族要成套,
Win/Mac各一套,风格统一很重要"
interface Button { void render(); }
interface TextField { void input(); }
class WinButton implements Button { /*...*/ }
class MacButton implements Button { /*...*/ }
interface GUIFactory {
Button createButton();
TextField createTextField();
}
class WinFactory implements GUIFactory { /*...*/ }
class MacFactory implements GUIFactory { /*...*/ }
4. 建造者模式(Builder)
场景:构造复杂对象(如AlertDialog)
口诀:
"分步构造对象,链式调用流畅,
避免构造器臃肿,参数再多不慌"
class Computer {
private String cpu;
private String ram;
// ...更多字段
static class Builder {
private Computer computer = new Computer();
Builder setCpu(String cpu) {
computer.cpu = cpu;
return this;
}
Computer build() {
return computer;
}
}
}
// 使用
Computer pc = new Computer.Builder()
.setCpu("i7")
.setRam("16G")
.build();
5. 原型模式(Prototype)
场景:高效创建相似对象
口诀:
"克隆代替新建,复制已有实例,
减少创建开销,深拷贝要注意"
class Sheep implements Cloneable {
String name;
@Override
protected Sheep clone() {
try {
return (Sheep) super.clone();
} catch (CloneNotSupportedException e) {
return null;
}
}
}
// 使用
Sheep original = new Sheep("多利");
Sheep clone = original.clone();
三、结构型模式(7种)
6. 适配器模式(Adapter)
场景:兼容老接口
口诀:
"接口不匹配?适配器来转接,
就像电源转换头,新旧都能用"
// 旧接口
class LegacyPrinter {
void printDocument() { /*...*/ }
}
// 新接口
interface Printer {
void print();
}
// 适配器
class PrinterAdapter implements Printer {
private LegacyPrinter legacyPrinter;
public void print() {
legacyPrinter.printDocument();
}
}
7. 装饰器模式(Decorator)
场景:动态扩展功能
口诀:
"包装原有对象,层层添加功能,
比继承更灵活,咖啡加糖加奶"
interface Coffee {
double getCost();
}
class SimpleCoffee implements Coffee { /*...*/ }
class MilkDecorator implements Coffee {
private Coffee coffee;
public double getCost() {
return coffee.getCost() + 0.5;
}
}
8. 代理模式(Proxy)
场景:控制对象访问
口诀:
"代购帮你买东西,前后都能加逻辑,
延迟加载/权限控制,真实对象被保护"
interface Image {
void display();
}
class RealImage implements Image { /*...*/ }
class ProxyImage implements Image {
private RealImage realImage;
public void display() {
if (realImage == null) {
realImage = new RealImage();
}
realImage.display();
}
}
(因篇幅限制,后续模式将以简表形式呈现)
四、行为型模式(11种)
| 模式 | 口诀 | 典型场景 |
|---|---|---|
| 策略模式 | "算法家族封装好,运行时自由切换,支付方式随便选" | 支付策略 |
| 观察者模式 | "发布订阅真方便,状态变化自动通知,就像微信群发" | 事件通知 |
| 责任链模式 | "处理请求排成链,每个节点有机会,审批流程最典型" | 权限校验 |
| 命令模式 | "请求封装成对象,支持撤销/重做,遥控器控制家电" | 任务队列 |
| 状态模式 | "状态变行为也变,避免if-else爆炸,自动售货机状态" | 游戏角色AI |
| 模板方法 | "流程骨架已定义,具体步骤子类填,造车步骤都一样" | 活动流程 |
| 访问者模式 | "数据结构稳定但操作多变,导购带你看商品" | 编译器AST处理 |
| 中介者模式 | "对象交互太混乱?找个中介来协调,就像租房中介" | 聊天室 |
| 备忘录模式 | "随时存档读档,对象状态可回溯,游戏存档最需要" | 撤销功能 |
| 迭代器模式 | "统一遍历接口,不管底层怎么存,for循环走天下" | 集合遍历 |
| 解释器模式 | "定义文法规则,SQL/正则都这么玩,特定领域语言" | 规则引擎 |
五、模式选择口诀
"创建对象不容易?工厂建造单例原型帮你忙
结构混乱难维护?适配代理装饰组合解忧愁
行为交互太复杂?策略观察责任链来理顺
二十三种招式熟,代码质量上层楼"
记住这些设计模式,你的代码就能从"野路子"变成"正规军"! 🎖️💻