深入浅出23种设计模式

88 阅读4分钟

深入浅出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/正则都这么玩,特定领域语言"规则引擎

五、模式选择口诀

"创建对象不容易?工厂建造单例原型帮你忙
结构混乱难维护?适配代理装饰组合解忧愁
行为交互太复杂?策略观察责任链来理顺
二十三种招式熟,代码质量上层楼"

记住这些设计模式,你的代码就能从"野路子"变成"正规军"! 🎖️💻