【设计模式】建造者模式

    建造者模式也属于创建型模式,定义为:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式是一种对象创建型模式。客户端在使用时,只需要指定复杂对象的类型,无需知道构建细节,就可以生成一个复杂的对象,UML图:
在这里插入图片描述
UML图中的角色介绍
    Bulider:抽象创建角色,包含两类抽象方法,bulidX(创建对象的组成部分),getresult(返回创建好的对象),由具体的建造者继承后实现。
    ConcreteBulider:具体的创建者,继承自Builder,实现抽象方法,明确自己要创建的对象,创建该产品的内部表示并定义它的装配过程。
    Director:指挥者,和客户端进行交互,它包含建造者成员,提供建造函数调用建造者对象的部件构造方法,完成对象的组建。
    Product:产品角色,最终生成的产品对象,它是一个复杂对象,包含多个成员属性。
代码体现:

//抽象创建角色
class Bulider
{
public:
    Product product;
    virtual void BulidA()=0;
    virtual void BulidB()=0;
    virtual void BulidC()=0;
    Product* getresult()
    {
        return product;
    }
};
//具体创建者
class ConcreteBulider
{
public:
    void BulidA()
    {
        std::string a = "苗条";
        product.setA(a);
        cout<<"制作了角色身材"<<endl;
    }
    void BulidB()
    {
        product.setB("温柔");
        cout<<"制作了角色长相"<<endl;
    }
    void BuildC()
    {
        product.setC("齐胸襦裙");
        cout<<"制作了角色服装"<<endl
    }
};
//指挥者
class Director
{
public:
    Director()
    {}
    ~Director()
    {}
    void setBulider(Bulider* build)
    {
        bulider=bulid;
    }
    Product* construct()
    {
        bulider->bulidA();
        bulider->bulidB();
        builder->bulidC();
        return builder->getresult();
    }
pirvete:
    Bulider* bulider;    
}
//产品
class Product
{
public:
    void setA(std::string a)
    {
       A = a;
       cout << "设置角色身材为a"<<endl;
    }
    //剩下的set和get不写了...
    void show()
    {
        cout<<"我是被创建出来的游戏角色"<<endl;
    }
private:
    std::string A;
    std::string B;
    std::string C;
};
//客户端的使用
int main()
{
    Bulider* bulider = new ConcreteBulider();
    Direct direct;
    direct.setBulider(bulider);
    Product* pro = direct->construct();
    pro->show();
    return 0;
}

    以上代码简单创建出了一个游戏角色,创建者模型是比较适用于这种对象由多个部分组成的场景下的。下面分析优缺点和适用场景。
优点:
    1.客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。
    2.每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象。由于指挥者类针对抽象建造者编程,增加新的具体建造者无须修改原有类库的代码,系统扩展方便,符合“开闭原则”。
    3.可以更加精细地控制产品的创建过程。将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程。
缺点:
    1.适用范围有一定限制,所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,例如很多组成部分都不相同,不适合使用建造者模式
    2.如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大,增加系统的理解难度和运行成本。
适用场景:
    1.被创建对象内部有复杂的内部结构,包含多个成员属性(这些属性需要按照一定顺序被创建)
    2. 对象的创建过程独立于创建该对象的类。在建造者模式中通过引入了指挥者类,将创建过程封装在指挥者类中,而不在建造者类和客户类中。
    3. 隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。
模式扩展:
    如果系统中只需要一个具体建造者的话,可以省略抽象建造者,省略抽象建造者之后,也可省略指挥者,具体建造者扮演指挥者与建造者双重角色。

### 设计模式建造者模式 #### 定义 建造者模式是一种创建型设计模式,旨在将复杂对象的构建过程与其具体表示分离开来。这种分离使得相同的构建流程能够生成不同的表现形式[^1]。 #### 主要特点 - **逐步构造**:通过一系列步骤完成复杂对象的组装,每一步骤可由独立的对象负责。 - **灵活性高**:允许按照需求定制化对象的构建逻辑,支持多种类型的组件组合[^2]。 - **职责清晰**:客户端只需指定所需的建造者类型,无需关心复杂对象的具体组成细节及其装配方法[^3]。 #### 使用场景 当遇到以下情况时,适合应用建造者模式: - 方法相同但执行顺序不同会引发差异化的结果; - 复杂对象需由多个部件或零件构成,而这些部件的不同排列会影响最终效果; - 对象本身较为繁复,或者其内部操作次序的变化能带来显著的功能区别[^4]。 #### 实现结构 以下是建造者模式的核心组成部分: 1. **Product (产品角色)** 表示被构建的复杂对象,包含各个部分的定义以及它们之间的关系管理机制。 2. **Builder (抽象建造者)** 提供用于创建产品各部分的标准接口,规定了具体的子类应实现哪些功能。 3. **Concrete Builder (具体建造者)** 继承自`Builder`并提供实际的产品组建方案;维护所建实例的状态直至完全成型后再交付给Director。 4. **Director (指挥者/导演)** 负责控制整个构建进程,依据特定规则调用相应Builder的操作以达成目标产物。 下面是一个简单的例子展示如何利用C++实现上述概念: ```cpp // 抽象建造者 class Builder { public: virtual ~Builder() {} virtual void buildPartA() = 0; virtual void buildPartB() = 0; virtual Product* getResult() const = 0; }; // 具体建造者 class ConcreteBuilder : public Builder { private: Product *product; public: ConcreteBuilder(): product(new Product()) {} void buildPartA() override { /* 构建 A 部件 */ } void buildPartB() override { /* 构建 B 部件 */ } Product* getResult() const override { return this->product;} }; // 导演类 class Director { private: Builder *_builder; public: Director(Builder *b): _builder(b) {} void construct(){ this->_builder->buildPartA(); this->_builder->buildPartB(); } }; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值