罗湖网站设计价格,免费加精准客源,网站设计项目,银行存款营销活动方案注意#xff1a;复现代码时#xff0c;确保 VS2022 使用 C17/20 标准以支持现代特性。
分步骤构造复杂对象#xff0c;实现灵活装配 1. 模式定义与用途
核心目标#xff1a;将复杂对象的构建过程分离#xff0c;使得同样的构建步骤可以创建不同的表示形式。 常见场景复现代码时确保 VS2022 使用 C17/20 标准以支持现代特性。
分步骤构造复杂对象实现灵活装配 1. 模式定义与用途
核心目标将复杂对象的构建过程分离使得同样的构建步骤可以创建不同的表示形式。 常见场景
创建包含多个组件的复杂对象如游戏角色、文档格式需要逐步构造对象并支持不同配置选项避免构造函数参数爆炸尤其是可选参数众多时 2. 模式结构解析 Builder定义构造步骤的抽象接口如 buildHead(), buildBody()ConcreteBuilder实现具体构造逻辑提供获取结果的接口Director控制构造流程可选可让客户端直接操作BuilderProduct最终构造的复杂对象 3. 现代 C 实现示例游戏角色构造
3.1 基础实现
#include iostream
#include memory
#include string// 产品游戏角色
class GameCharacter {
public:void setHead(const std::string head) { head_ head; }void setBody(const std::string body) { body_ body; }void setWeapon(const std::string weapon) { weapon_ weapon; }void describe() const {std::cout Character: head_ , body_ , wielding weapon_ \n;}private:std::string head_;std::string body_;std::string weapon_;
};// 抽象建造者
class CharacterBuilder {
public:virtual ~CharacterBuilder() default;virtual void buildHead() 0;virtual void buildBody() 0;virtual void buildWeapon() 0;virtual std::unique_ptrGameCharacter getResult() 0;
};// 具体建造者骑士
class KnightBuilder : public CharacterBuilder {
public:KnightBuilder() { character_ std::make_uniqueGameCharacter(); }void buildHead() override { character_-setHead(Steel Helmet); }void buildBody() override { character_-setBody(Plate Armor); }void buildWeapon() override { character_-setWeapon(Longsword); }std::unique_ptrGameCharacter getResult() override { return std::move(character_); }private:std::unique_ptrGameCharacter character_;
};// 具体建造者法师
class MageBuilder : public CharacterBuilder {
public:MageBuilder() { character_ std::make_uniqueGameCharacter(); }void buildHead() override { character_-setHead(Pointed Hat); }void buildBody() override { character_-setBody(Robe); }void buildWeapon() override { character_-setWeapon(Staff); }std::unique_ptrGameCharacter getResult() override { return std::move(character_); }private:std::unique_ptrGameCharacter character_;
};// 指挥者可选
class CharacterDirector {
public:std::unique_ptrGameCharacter createCharacter(CharacterBuilder builder) {builder.buildHead();builder.buildBody();builder.buildWeapon();return builder.getResult();}
};// 客户端代码
int main() {KnightBuilder knightBuilder;MageBuilder mageBuilder;CharacterDirector director;auto knight director.createCharacter(knightBuilder);auto mage director.createCharacter(mageBuilder);knight-describe(); // Character: Steel Helmet, Plate Armor, wielding Longswordmage-describe(); // Character: Pointed Hat, Robe, wielding Staffreturn 0;
}代码解析
将角色构造分解为独立步骤新增角色类型只需添加新的 ConcreteBuilder使用 std::unique_ptr 明确所有权转移防止资源泄漏 3.2 支持链式调用的增强实现
// 流畅接口Fluent Interface改进
class AdvancedCharacterBuilder {
public:AdvancedCharacterBuilder withHead(const std::string head) {head_ head;return *this;}AdvancedCharacterBuilder withBody(const std::string body) {body_ body;return *this;}AdvancedCharacterBuilder withWeapon(const std::string weapon) {weapon_ weapon;return *this;}std::unique_ptrGameCharacter build() {auto character std::make_uniqueGameCharacter();character-setHead(head_);character-setBody(body_);character-setWeapon(weapon_);return character;}private:std::string head_;std::string body_;std::string weapon_;
};// 客户端使用
void createCustomCharacter() {auto builder AdvancedCharacterBuilder();auto character builder.withHead(Hood).withBody(Leather Armor).withWeapon(Dagger).build();character-describe();
}代码解析
通过返回 this 指针实现链式调用提升代码可读性支持可选参数和任意顺序设置属性 4. 应用场景示例HTTP请求构造
class HttpRequest {
public:void setMethod(const std::string method) { method_ method; }void setUrl(const std::string url) { url_ url; }void addHeader(const std::string key, const std::string value) {headers_[key] value;}void setBody(const std::string body) { body_ body; }void send() const {std::cout Sending method_ url_ with body: body_ \n;}private:std::string method_;std::string url_;std::mapstd::string, std::string headers_;std::string body_;
};class HttpRequestBuilder {
public:HttpRequestBuilder() : request_(std::make_uniqueHttpRequest()) {}HttpRequestBuilder method(const std::string method) {request_-setMethod(method);return *this;}HttpRequestBuilder url(const std::string url) {request_-setUrl(url);return *this;}HttpRequestBuilder header(const std::string key, const std::string value) {request_-addHeader(key, value);return *this;}HttpRequestBuilder body(const std::string body) {request_-setBody(body);return *this;}std::unique_ptrHttpRequest build() {return std::move(request_);}private:std::unique_ptrHttpRequest request_;
};// 使用示例
void sendPostRequest() {auto request HttpRequestBuilder().method(POST).url(https://api.example.com/data).header(Content-Type, application/json).body(R({key: value})).build();request-send();
}5. 优缺点分析
优点缺点分步骤构造复杂对象代码清晰需定义多个Builder类增加代码量支持不同配置和构造顺序对简单对象可能过度设计隔离复杂构造逻辑与业务代码需维护Builder与Product的同步 6. 调试与优化策略
参数验证在Builder方法中添加有效性检查防止非法状态对象复用对频繁创建的对象实现reset()方法重用Builder实例性能分析使用std::move优化字符串等大型数据成员的传递效率 模式结构解析网图备份