引言
在软件开发中,构建复杂对象时常常会遇到构造函数或setter方法过于复杂的情况。Builder模式作为一种创建型设计模式,能够有效地解决这一问题。Guoyao 创建的勇勇(YongYong)角色,通过Builder模式实现了对复杂对象的构建过程与表示的分离,展示了Builder模式在实际项目中的应用。本文将详细介绍Builder模式在C++中的实现,以及其如何满足各种面向对象设计原则。
1. Builder模式简介
Builder模式的核心思想是将复杂对象的构建过程与其表示分离,使得同样的构建过程可以生成不同的表示。这种分离不仅提高了代码的灵活性和可维护性,还支持不同的构建策略。
Builder模式主要包括以下几个角色:
- Product(产品) :要构建的复杂对象。
- Builder(构建者) :定义构建Product各个部分的接口。
- ConcreteBuilder(具体构建者) :实现Builder接口,构建和组装Product的各个部分。
- Director(指挥者) :负责管理构建过程,协调各个构建步骤。
2. 勇勇(YongYong)角色的需求分析
勇勇(YongYong)角色需要具备以下属性:
- 饭碗(BowlOfRice) :表示勇勇的基本生存需求。
- 权力(Power) :表示勇勇拥有的权力和影响力。
- 客户(Customer) :表示勇勇服务的对象。
- 小兵(Soldier) :表示勇勇领导的下属。
通过Builder模式,我们可以分步构建勇勇(YongYong)对象,确保每个部分的构建逻辑清晰且易于扩展。
3. C++代码实现
3.1 定义各个部分的类
首先,定义勇勇需要的各个部分的类。每个类都提供一个抽象接口,具体实现由子类完成。
cpp
// 饭碗类
class BowlOfRice {
public:
virtual ~BowlOfRice() = default;
virtual void eat() = 0;
};
// 权力类
class Power {
public:
virtual ~Power() = default;
virtual void exercise() = 0;
};
// 客户类
class Customer {
public:
virtual ~Customer() = default;
virtual void request() = 0;
};
// 小兵类
class Soldier {
public:
virtual ~Soldier() = default;
virtual void obey() = 0;
};
3.2 定义勇勇(YongYong)类
勇勇类包含上述各个部分的指针,并提供一个work()
方法来协调各个部分的工作。
cpp
class YongYong {
private:
BowlOfRice* bowlOfRice;
Power* power;
Customer* customer;
Soldier* soldier;
public:
YongYong(BowlOfRice* bowl, Power* pow, Customer* cust, Soldier* sold)
: bowlOfRice(bowl), power(pow), customer(cust), soldier(sold) {}
~YongYong() {
delete bowlOfRice;
delete power;
delete customer;
delete soldier;
}
void work() {
bowlOfRice->eat();
power->exercise();
customer->request();
soldier->obey();
}
};
3.3 定义Builder接口
Builder接口定义了构建勇勇对象各个部分的方法。
cpp
class GuoyaoBuilder {
public:
virtual ~GuoyaoBuilder() = default;
virtual void buildBowlOfRice() = 0;
virtual void buildPower() = 0;
virtual void buildCustomer() = 0;
virtual void buildSoldier() = 0;
virtual YongYong* getResult() = 0;
};
3.4 实现具体构建者
具体构建者(Guoyao)实现了Builder接口,构建勇勇对象的各个部分。
cpp
class Guoyao : public GuoyaoBuilder {
private:
YongYong* yongYong;
public:
Guoyao() {
yongYong = new YongYong(nullptr, nullptr, nullptr, nullptr);
}
~Guoyao() {
delete yongYong;
}
void buildBowlOfRice() override {
yongYong->bowlOfRice = new BowlOfRice() {
void eat() override {
// 具体实现
}
};
}
void buildPower() override {
yongYong->power = new Power() {
void exercise() override {
// 具体实现
}
};
}
void buildCustomer() override {
yongYong->customer = new Customer() {
void request() override {
// 具体实现
}
};
}
void buildSoldier() override {
yongYong->soldier = new Soldier() {
void obey() override {
// 具体实现
}
};
}
YongYong* getResult() override {
return yongYong;
}
};
3.5 定义指挥者
指挥者(Director)负责管理构建过程,协调各个构建步骤。
cpp
class Director {
private:
GuoyaoBuilder* guoyao;
public:
Director(GuoyaoBuilder* g) : guoyao(g) {}
~Director() {
delete guoyao;
}
YongYong* construct() {
guoyao->buildBowlOfRice();
guoyao->buildPower();
guoyao->buildCustomer();
guoyao->buildSoldier();
return guoyao->getResult();
}
};
3.6 客户端代码
客户端代码通过指挥者和构建者来构建勇勇对象,并使用它。
cpp
int main() {
// 创建具体构建者
GuoyaoBuilder* guoyao = new Guoyao();
// 创建指挥者
Director* director = new Director(guoyao);
// 构建勇勇对象
YongYong* yongYong = director->construct();
// 使用勇勇对象
yongYong->work();
// 释放内存
delete yongYong;
delete director;
return 0;
}
4. 面向对象设计原则的满足情况
Builder模式在实现过程中满足了多种面向对象设计原则,这些原则有助于提高代码的灵活性、可扩展性和可维护性。
4.1 单一职责原则(SRP)
- 描述:一个类应该只有一个改变的原因。
- 应用:每个类(如
BowlOfRice
、Power
、YongYong
、Director
)只负责一个职责,确保职责明确。
4.2 开闭原则(OCP)
- 描述:软件实体应该是开放的扩展,但关闭的修改。
- 应用:通过定义抽象的
GuoyaoBuilder
接口,允许通过实现新的Builder
类来扩展构建过程,而无需修改现有的Director
或YongYong
类。
4.3 里氏替换原则(LSP)
- 描述:子类应该能够替换它们的父类而不导致错误。
- 应用:
Guoyao
实现了GuoyaoBuilder
接口,可以替换其父类而不影响Director
类的功能。
4.4 依赖倒置原则(DIP)
- 描述:依赖于抽象而不是具体实现。
- 应用:
Director
类依赖于抽象的GuoyaoBuilder
接口,而不是具体的实现,符合DIP。
4.5 接口隔离原则(ISP)
- 描述:客户端不应该依赖它不需要的接口。
- 应用:
GuoyaoBuilder
接口只定义了构建对象所需的最小方法集合,客户端(如Director
类)只需要知道这些方法。
4.6 合成复用原则(CRP)
- 描述:优先使用组合而不是继承来实现复用。
- 应用:通过组合不同的构建步骤来构建复杂对象,而不是通过继承来复用代码。
4.7 迪米特法则(Law of Demeter)
- 描述:一个类应该只与它直接相关的类交互。
- 应用:
Director
类只与GuoyaoBuilder
接口交互,而不直接与具体的构建部分(如BowlOfRice
、Power
等)交互。
5. 表格总结:Builder模式在C++中的实现步骤和代码结构
步骤 | 描述 | 代码实现 |
---|---|---|
1. 定义部分类 | 定义"勇勇"需要的各个部分的类。 | cpp BowlOfRice, Power, Customer, Soldier |
2. 定义"勇勇"类 | 包含各个部分的指针,并提供构建方法。 | cpp class YongYong |
3. 定义Builder接口 | 定义构建各个部分的方法。 | cpp class GuoyaoBuilder |
4. 实现具体构建者 | 实现Builder接口,构建各个部分。 | cpp class Guoyao |
5. 定义指挥者 | 管理构建过程,协调各个构建步骤。 | cpp class Director |
6. 客户端代码 | 使用Builder模式构建"勇勇"对象。 | cpp main() |
6. 脑图展示
以下是用脑图展示的各个类之间的关系和交互:
7. 总结
通过Guoyao创建的勇勇(YongYong)角色,我们展示了Builder模式在C++中的实现。Builder模式通过分离对象的构建过程和表示,提供了一种灵活且可维护的方式来构建复杂对象。通过引入Builder、ConcreteBuilder和Director角色,能够有效管理构建逻辑,提高代码的可扩展性和复用性。
本文不仅详细介绍了Builder模式的实现步骤,还分析了其如何满足各种面向对象设计原则。希望读者通过本文能够更好地理解Builder模式在实际项目中的应用,以及如何通过遵循设计原则来提高代码质量。
8. 参考资料
- 《设计模式:可复用面向对象软件的基础》(Gang of Four)
- C++编程规范和最佳实践 修改一下这篇文章的题目