深度解析设计模式:透过现象,见设计本质(二)
2023-09-10 19:23:18
设计模式:剖析工厂方法、抽象工厂、建造者、原型和单例模式
在软件开发中,设计模式是一组可重复使用的解决方案,可帮助我们创建灵活、可扩展且易于维护的代码。在这篇文章中,我们将深入探讨五种广受欢迎的设计模式:工厂方法、抽象工厂、建造者、原型和单例。
工厂方法模式
想象一下一个汽车制造商生产各种型号的汽车。每个型号都有其独特的特性和行为。使用工厂方法模式,我们可以将创建汽车的共性行为抽象到一个接口中,称为 汽车工厂
。具体型号的创建由继承自 汽车工厂
的子类来处理,例如 宝马工厂
和 奔驰工厂
。当我们需要创建特定型号的汽车时,我们会使用工厂方法,它根据传递的参数动态地选择合适的子类并创建一个对象。
interface 汽车工厂 {
创建汽车();
}
class 宝马工厂 implements 汽车工厂 {
@Override
创建汽车() {
return new 宝马();
}
}
class 奔驰工厂 implements 汽车工厂 {
@Override
创建汽车() {
return new 奔驰();
}
}
抽象工厂模式
现在考虑一个生产家具的制造商,它提供不同系列的家具,例如现代系列和古典系列。每个系列都有其自己的独特设计和材料。使用抽象工厂模式,我们可以将创建不同系列家具的共性行为抽象到一个接口中,称为 家具工厂
。具体系列的创建由继承自 家具工厂
的子类来处理,例如 现代家具工厂
和 古典家具工厂
。当我们需要创建特定系列的家具时,我们会使用抽象工厂方法,它根据传递的参数动态地选择合适的子类并创建一个对象。
interface 家具工厂 {
创建沙发();
创建桌子();
创建椅子();
}
class 现代家具工厂 implements 家具工厂 {
@Override
创建沙发() {
return new 现代沙发();
}
@Override
创建桌子() {
return new 现代桌子();
}
@Override
创建椅子() {
return new 现代椅子();
}
}
class 古典家具工厂 implements 家具工厂 {
@Override
创建沙发() {
return new 古典沙发();
}
@Override
创建桌子() {
return new 古典桌子();
}
@Override
创建椅子() {
return new 古典椅子();
}
}
建造者模式
想象一下你要建造一栋房子。建造过程涉及许多步骤,从打地基到安装屋顶。使用建造者模式,我们可以将建造房子的步骤抽象到一个接口中,称为 房子建造者
。具体建造过程的实现由继承自 房子建造者
的子类来处理,例如 木制房屋建造者
和 砖石房屋建造者
。当我们需要建造特定类型的房子时,我们会使用建造者模式,它根据传递的参数动态地选择合适的子类并逐步构建对象。
interface 房子建造者 {
建造地基();
建造框架();
建造屋顶();
}
class 木制房屋建造者 implements 房子建造者 {
@Override
建造地基() {
// ...
}
@Override
建造框架() {
// ...
}
@Override
建造屋顶() {
// ...
}
}
class 砖石房屋建造者 implements 房子建造者 {
@Override
建造地基() {
// ...
}
@Override
建造框架() {
// ...
}
@Override
建造屋顶() {
// ...
}
}
原型模式
原型模式基于克隆的概念。想象一下一个图形编辑器,它允许用户创建和编辑各种形状。为了避免重复创建相同的形状,我们可以使用原型模式。首先,我们创建每个形状的原型,它是一个可以被克隆的对象。当我们需要创建一个新形状时,我们不会从头开始创建它,而是克隆原型并对其进行必要的修改。
class 形状 {
// ...
}
class 圆形 extends 形状 {
// ...
}
class 正方形 extends 形状 {
// ...
}
// ...
形状 克隆() {
return this.clone();
}
单例模式
在某些情况下,我们只需要一个特定类的一个实例。单例模式确保这一点,它通过创建该类的唯一实例并提供一个全局访问点来实现。当需要访问该类时,我们使用单例模式,它返回其唯一实例。
class 单例 {
private static 单例 _instance;
private 单例() {
// ...
}
public static 单例 获取实例() {
if (_instance == null) {
_instance = new 单例();
}
return _instance;
}
}
结论
工厂方法、抽象工厂、建造者、原型和单例模式是软件开发中常用的设计模式。它们提供了一种灵活且可扩展的方法来创建和管理对象,从而提高代码的可维护性和可扩展性。理解这些模式并将其应用于你的项目中可以极大地改善你的代码质量和可读性。
常见问题解答
- 为什么使用工厂方法模式?
工厂方法模式允许我们在不修改客户端代码的情况下添加新的产品。
- 抽象工厂模式与工厂方法模式有何区别?
抽象工厂模式创建一系列相关的产品,而工厂方法模式创建单个产品。
- 建造者模式的优点是什么?
建造者模式可以将对象的构建过程与表示分离,从而允许使用相同的构建过程创建不同的表示。
- 原型模式什么时候有用?
原型模式在需要创建许多相同或类似对象的场景中很有用。
- 什么时候使用单例模式?
当我们需要确保类只有一个实例时,使用单例模式。