建造者模式(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;
}