设计模式分类全景解析

🌟 设计模式三大类型概述

设计模式根据其核心目的被分为三大类,构成软件设计的"黄金三角":

分类核心关注点比喻说明典型模式数量
创建型对象创建机制"造物主"——控制对象的诞生方式5种
结构型对象组合方式"建筑师"——设计对象间的结构关系7种
行为型对象交互通信"协调者"——管理对象的行为协作11种

🏗 创建型模式(5种)——解决"对象怎么来"

1. 工厂方法(Factory Method)

  • 核心:让子类决定实例化哪个类

  • 场景:日志记录器、支付网关等需要扩展的创建场景

  • 示例

    java

    复制

    interface Payment { void pay(); }
    class Alipay implements Payment { /*...*/ }
    class WechatPay implements Payment { /*...*/ }
    
    abstract class PaymentFactory {
        abstract Payment create();
    }

2. 抽象工厂(Abstract Factory)

  • 核心:创建相关产品家族

  • 场景:跨平台UI组件(Windows/macOS风格按钮+菜单)

  • 特点:比工厂方法更高维度的抽象

3. 原型(Prototype)

  • 核心:通过克隆现有对象来创建新对象

  • 场景:游戏怪物生成、复杂对象初始化成本高时

4. 单例(Singleton)

  • 核心:确保类只有一个实例

  • 场景:数据库连接池、配置管理器

  • 线程安全实现

    java

    复制

    class Singleton {
        private static volatile Singleton instance;
        private Singleton() {}
        public static Singleton getInstance() {
            if (instance == null) {
                synchronized (Singleton.class) {
                    if (instance == null) {
                        instance = new Singleton();
                    }
                }
            }
            return instance;
        }
    }

5. 生成器(Builder)

  • 核心:分步构建复杂对象

  • 场景:定制电脑配置、SQL查询构建

  • 现代变体

    java

    复制

    Computer pc = new Computer.Builder()
        .cpu("i7")
        .ram("16GB")
        .build();

🧩 结构型模式(7种)——解决"对象怎么组合"

1. 适配器(Adapter)

  • 核心:转换接口使得不兼容的类可以协作

  • 类型

    • 类适配器(继承)

    • 对象适配器(组合)

2. 桥接(Bridge)

  • 核心:将抽象与实现解耦

  • 场景:跨平台图形渲染(OpenGL/Vulkan)

3. 组合(Composite)

  • 核心:用树形结构处理部分-整体关系

  • 场景:文件系统、UI组件嵌套

4. 装饰器(Decorator)

  • 核心:动态添加职责

  • 特点:比继承更灵活

  • 示例

    java

    复制

    interface Coffee { double cost(); }
    class SimpleCoffee implements Coffee { /*...*/ }
    class MilkDecorator implements Coffee {
        private Coffee decorated;
        public double cost() { return decorated.cost() + 0.5; }
    }

5. 外观(Facade)

  • 核心:为复杂子系统提供统一入口

  • 场景:编译器前端接口

6. 享元(Flyweight)

  • 核心:共享细粒度对象

  • 关键:区分内部状态(共享)和外部状态(非共享)

  • 场景:文字编辑器中的字符对象

7. 代理(Proxy)

  • 类型对比

    类型目的示例
    虚拟代理延迟初始化图片懒加载
    保护代理访问控制权限验证
    远程代理网络通信RPC调用

🤝 行为型模式(11种)——解决"对象怎么协作"

1. 职责链(Chain of Responsibility)

  • 核心:使多个对象都有机会处理请求

  • 场景:审批系统、异常处理

2. 命令(Command)

  • 进阶应用

    • 宏命令(组合多个命令)

    • 事务回滚(undo操作)

3. 迭代器(Iterator)

  • 现代语言支持

    • Java的Iterable接口

    • Python的__iter__协议

4. 中介者(Mediator)

  • 核心:用中介对象封装一组对象交互

  • 场景:聊天室、机场塔台调度

5. 备忘录(Memento)

  • 实现要点

    • Originator(原发器)负责创建/恢复备忘录

    • Caretaker(管理者)仅存储备忘录

6. 观察者(Observer)

  • 发布-订阅变体

    java

    复制

    class EventBus {
        private Map<String, List<Consumer>> subscribers = new HashMap<>();
        void subscribe(String event, Consumer listener) { /*...*/ }
        void publish(String event, Object data) { /*...*/ }
    }

7. 状态(State)

  • 与策略模式区别

    • 状态模式:状态驱动行为改变(自动转换)

    • 策略模式:客户端主动切换算法

8. 策略(Strategy)

  • Java 8+实现

    java

    复制

    interface BillingStrategy {
        double calculate(double price);
    }
    
    BillingStrategy normal = price -> price;
    BillingStrategy discount = price -> price * 0.8;

9. 模板方法(Template Method)

  • 好莱坞原则:"Don't call us, we'll call you"

  • 示例

    java

    复制

    abstract class Game {
        final void play() { // 模板方法
            initialize();
            startPlay();
            endPlay();
        }
        abstract void initialize();
    }

10. 访问者(Visitor)

  • 双分派机制

    java

    复制

    interface Element { void accept(Visitor v); }
    class ConcreteElement implements Element {
        public void accept(Visitor v) {
            v.visit(this); // 第二次分派
        }
    }

11. 解释器(Interpreter)

  • 场景:SQL解析、正则表达式处理

  • 经典实现:抽象语法树(AST)

🔍 模式关系网络

mermaid

复制

graph TD
    A[工厂方法] --> B[抽象工厂]
    C[组合] --> D[迭代器]
    E[观察者] --> F[中介者]
    G[策略] --> H[状态]
    I[装饰器] --> J[代理]
    K[命令] --> L[备忘录]

💡 设计智慧

  • 创建型模式是土壤,孕育对象生命

  • 结构型模式是骨架,构建系统框架

  • 行为型模式是神经,协调对象交互

掌握这23种设计模式,就拥有了应对软件复杂性的完整工具箱!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值