构建者模式:
bulid模式的目的:
- 通过“对象创建”模式绕开new,避免对象穿件过程中的紧耦合(依赖具体类)
- 将一个“复杂对象”的
创建工作
与其表示内容
分离,使得同样的构建过程可以根据不同的表示进行变化。
构建者模式架构:
其中各部分的作用为:
Builder: 为创建一个Product对象的各个部件指定抽象接口。
ConcreteBuilder: 实现Builder的接口以构造和装配该产品的各个部件;定义并明确它所创建的表示。
Director:构造一个使用Builder接口的对象;表示创建的过程和具体操作。
Product:表示被构造的复杂对象。ConcreteBuilder 创建该产品的内部表示并定义它的装配过程。包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
举个例子:
我需要生产一种product
,该product的主要属性有num
,color
,type
三种,我们平时见到同一种产品会有不同的包装,形状等等,在这里我们使用我们的Builder
来对该产品的属性进行表示,不同的Builder
会把产品包装成各种样子,最后通过Director
对产品的生产流程进行规定,比如说我们先设定它的num
,在设定color
,最后设定type
。
这么做的好处:
Builder
对象提供给导向器的抽象接口的具体实现是在Builder
内部,那么在改变接口内部的具体实现的时候就不会对导向器使用接口产生影响。它隐藏了产品是如何装配的。另外,因为Builder
的抽象接口是一定的,那么你在改变产品的内部结构的时候只需要定义一个新的生成器ConcreteBuilder
。然后使用这个生成器去装配产品即可。- 它将构造代码和表示代码分开,
builder
模式通过封装一个复杂对象的创建和表示方式提高了对象的模块性。客户不需要知道定义产品内部的结构的类的所有信息。这些类是不出现在builder接口中的。每个ConcerteBuilder
包含了创建和装配一个特定产品的所有代码。这些代码只需要写一次,然后不同的Director
可以复用它以在相同的部件集合的基础上构作不同的Product
。 - 它使你可对构造过程进行更精细的控制。
Builder
模式与一下子就生成产品的创建型模式不同,他是在Director
的控制下一步步构造产品。仅当产品构造完成后才从生成器取回它。因此Builder
接口相比其他创建型模式能更好地反应产品构造过程。这使你能更精细地控制构建过程,从而能更精细地控制所得产品的内部结构。
通俗的代码实现:
产品
typedef enum
{
type1,
type2
}ProductType;
class Product //产品
{
public:
void setNum(int num);
void setColor(string color);
void setType(ProductType type);
void showProduct();
private:
int m_num;
string m_color;
ProductType m_type;
};
void Product::setNum(int num)
{
m_num = num;
}
void Product::setColor(string color)
{
m_color = color;
}
void Product::setType(ProductType type)
{
m_type = type;
}
void Product::showProduct()
{
cout << "Product: " << endl;
cout << "num : " << m_num << endl;
cout << "color: " << m_color.data() << endl;
cout << "type : " << m_type << endl;
}
建造者父类:
class Builder
{
public:
Builder() {}
virtual ~Builder() {}
virtual void buildNum(int num) = 0;
virtual void buildColor(string color) = 0;
virtual void buildType(ProductType type) = 0;
virtual void createProduct() = 0;
virtual Product* getProduct() = 0;
virtual void show() = 0;
};
建造者 A && B:
//建造者A
class BuilderA :public Builder
{
public:
BuilderA() {}
~BuilderA() {}
void buildNum(int num) override;
void buildColor(string color) override;
void buildType(ProductType type) override;
void createProduct() override;
Product* getProduct() override;
void show() override;
private:
Product * m_product;
};
void BuilderA::buildNum(int num)
{
cout << "BuilderA build Num: " << num << endl;
m_product->setNum(num);
}
void BuilderA::buildColor(string color)
{
cout << "BuilderA build color: " << color.data() << endl;
m_product->setColor(color);
}
void BuilderA::buildType(ProductType type)
{
cout << "BuilderA build type: " << type << endl;
m_product->setType(type);
}
void BuilderA::createProduct()
{
cout << "BuilderA CreateProduct: " << endl;
m_product = new Product();
}
Product* BuilderA::getProduct()
{
return m_product;
}
void BuilderA::show()
{
m_product->showProduct();
}
//建造者B
class BuilderB :public Builder
{
public:
BuilderB() {}
~BuilderB() {}
void buildNum(int num) override;
void buildColor(string color) override;
void buildType(ProductType type) override;
void createProduct() override;
Product* getProduct() override;
void show() override;
private:
Product * m_product;
};
void BuilderB::buildNum(int num)
{
cout << "BuilderB build Num: " << num << endl;
m_product->setNum(num);
}
void BuilderB::buildColor(string color)
{
cout << "BuilderB build color: " << color.data() << endl;
m_product->setColor(color);
}
void BuilderB::buildType(ProductType type)
{
cout << "BuilderB build type: " << type << endl;
m_product->setType(type);
}
void BuilderB::createProduct()
{
cout << "BuilderB CreateProduct: " << endl;
m_product = new Product();
}
Product* BuilderB::getProduct()
{
return m_product;
}
void BuilderB::show()
{
m_product->showProduct();
}
管理类:
class Director
{
public:
Director(Builder* builder) :m_builder(builder)
{
}
void construct(int num, string color, ProductType type)
{
m_builder->createProduct();
m_builder->buildNum(num);
m_builder->buildColor(color);
m_builder->buildType(type);
}
private:
Builder * m_builder;
};
特别感谢: