类模式和对象模式
一、类模式(Class Pattern)
-
实现方式:使用继承关系,在编译时静态绑定。
-
特点:
- 行为在类层级中固定,难以在运行时改变。
- 通常通过重写父类方法或模板方法来定义算法骨架。
- 结构相对简单,但耦合度高(子类依赖父类)。
-
典型模式:
- 创建型:工厂方法(Factory Method)
- 结构型:类适配器(需要多重继承,如 C++,Java/.NET 中较少见)
- 行为型:模板方法(Template Method)、解释器(Interpreter)
二、对象模式(Object Pattern)
-
实现方式:使用对象组合或委托,在运行时动态绑定。
-
特点:
- 更灵活,可在运行时替换对象行为或结构。
- 遵循“组合优于继承”原则,降低耦合。
- 通常涉及多个对象协作,代码稍复杂。
-
典型模式:23种设计模式
- 大部分设计模式都属于对象模式,例如:
- 创建型:抽象工厂、建造者、原型、单例
- 结构型:桥接、组合、装饰、外观、享元、代理、对象适配器
- 行为型:策略、观察者、命令、状态、责任链、访问者、中介者、备忘录、迭代器
- 大部分设计模式都属于对象模式,例如:
三、对比总结
| 特性 | 类模式 | 对象模式 |
|---|---|---|
| 关系建立时机 | 编译时(静态) | 运行时(动态) |
| 复用机制 | 继承(is-a) | 组合/委托(has-a) |
| 灵活性 | 较低,无法在运行时改变 | 较高,可动态替换组件 |
| 耦合度 | 较高(子类依赖父类) | 较低(依赖接口/抽象) |
| 典型例子 | 模板方法、工厂方法 | 23种设计模式策略、观察者、装饰器 |
四、在 GoF 分类中的体现
GoF 的 23 种模式按目的 × 作用范围划分:
| 目的 / 范围 | 类模式 | 对象模式 |
|---|---|---|
| 创建型 | 工厂方法 | 抽象工厂、建造者、原型、单例 |
| 结构型 | 适配器(类适配器) | 适配器(对象适配器)、桥接、组合、装饰、外观、享元、代理 |
| 行为型 | 模板方法、解释器 | 策略、观察者、命令、状态、责任链、访问者、中介者、备忘录、迭代器 |
注:类适配器模式需要多重继承,在 Java/C# 等单继承语言中不常用,通常用对象适配器替代。
简单记忆口诀:
类模式靠继承,静态绑死;对象模式靠组合,动态灵活。