设计模式

建造者模式(Builder Pattern)

2019-07-25  本文已影响0人  superLiS

问题

在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。这种情况抽象出来的解决方案就是Builder模式。

Builder模式描述

建造者模式,就是通过其他对象(建造者类)去一步一步构建成需要的较为复杂的对象。它提供了一种创建复杂对象的方式。这样可以将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。如果你要创建一个较为复杂的对象,而这个对象是由数个子对象灵活构成,就可以考虑创建一个这个对象的建造者,专门负责这个复杂对象的创建工作。

适用性

在以下情况下使用建造者模式:

与抽象工厂模式的区别

Abstract Factory与Builder相似,同属于创建型模式,都是创建复杂对象,但最大的不同在于,Builder模式着重于一步步构造一个复杂对象,而Abstract Factory着重于多个系列的产品对象。具体在代码中,可以看到工厂模式强调Product的派生(产品都由Product抽象类派生),而建造者模式却强调Product的复杂构成组合。

#include<string>
#include <iostream>
using namespace std;

//待建造——被构造的复杂对象
class Product{
private:
    int a;
    string b;
public:
    Product(){
    }

    void setA(const int a){
        this->a=a;
    }

    void setB(const string b){
        this->b=b;
    }

    void output(){
        cout<<this->a<<" "<<this->b<<endl;
    }
};

//建造者抽象类——为创建一个Product对象的各个部件指定抽象接口
class Builder{
public:
    virtual void buildA(const int pars)=0;
    virtual void buildB(const string pars)=0;
    virtual Product* build()=0;
};

//建造者——实现Builder的接口以构造和装配该产品的各个部件
class ConcreteBuilder: public Builder{
private:
    Product* product;
public:
    ConcreteBuilder(){
        product=new Product();
    }

    void buildA(const int pars){
        product->setA(pars);
    }

    void buildB(const string pars){
        product->setB(pars);
    }

    Product* build(){
        return product;
    }
};

//导演——构造一个使用Builder接口的对象
class Directer{
private:
    Builder* builder;

public:
    Directer(Builder* builder){
        this->builder=builder;
    }

    Product* construct(const int pars_a,const string pars_b){
        builder->buildA(pars_a);
        builder->buildB(pars_b);
        return builder->build();
    }
};

int main(){
    Builder* builder=new ConcreteBuilder();
    Directer* directer=new Directer(builder);
    Product* product=directer->construct(10,"ten");
    product->output();

    delete product;
    delete directer;
    delete builder;

    return 0;
}
上一篇 下一篇

猜你喜欢

热点阅读