建造者模式属于创建型模式

适用于:

  • 需要生成的产品对象有复杂的内部结构
  • 需要生成的产品对象的属性相互依赖
  • 对象的创建过程独立于创建该对象的类
  • 隔离复杂对象的创建和使用

模式优点:

  • 将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象
  • 每一个剧吐建造者都相对独立,与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,拓展方便,符合开闭原则
  • 可以更加精细的控制产品的创建过程

模式缺点:

  • 建造者模式所创建的产品一边具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,不适用创建者模式

类图:

【设计模式】建造者模式 C++ 创建型模式

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

class Product{
public:
    string PartA,PartB,PartC;
};
class Builder{
public:
    Product product;
    virtual string getBuilderPartA() = 0;
    virtual string getBuilderPartB() = 0;
    virtual string getBuilderPartC() = 0;

    virtual void setBuilderPartA(string data) = 0;
    virtual void setBuilderPartB(string data) = 0;
    virtual void setBuilderPartC(string data) = 0;
};

class ConcreteBuilder:public Builder{
public:
    string getBuilderPartA();
    string getBuilderPartB();
    string getBuilderPartC();

    void setBuilderPartA(string data);
    void setBuilderPartB(string data);
    void setBuilderPartC(string data);
};
void ConcreteBuilder::setBuilderPartA(string data){	product.PartA = data;}
void ConcreteBuilder::setBuilderPartB(string data){	product.PartB = data;}
void ConcreteBuilder::setBuilderPartC(string data){	product.PartC = data;}

string ConcreteBuilder::getBuilderPartA(){	return product.PartA;}
string ConcreteBuilder::getBuilderPartB(){	return product.PartB;}
string ConcreteBuilder::getBuilderPartC(){	return product.PartC;}





class ConcreteBuilder2:public Builder{
public:
    string getBuilderPartA();
    string getBuilderPartB();
    string getBuilderPartC();

    void setBuilderPartA(string data);
    void setBuilderPartB(string data);
    void setBuilderPartC(string data);
};
void ConcreteBuilder2::setBuilderPartA(string data){	product.PartA = data;}
void ConcreteBuilder2::setBuilderPartB(string data){	product.PartB = data;}
void ConcreteBuilder2::setBuilderPartC(string data){	product.PartC = data;}

string ConcreteBuilder2::getBuilderPartA(){	return product.PartA;}
string ConcreteBuilder2::getBuilderPartB(){	return product.PartB;}
string ConcreteBuilder2::getBuilderPartC(){	return product.PartC;}



class Director{
public:
    void Construct(Builder *builder);
};
void Director::Construct(Builder *builder){
    cout << "This is Construct" << endl;
    builder->setBuilderPartA("A");
    builder->setBuilderPartB("B");
    builder->setBuilderPartC("C");

    cout << builder->getBuilderPartA() << endl;
    cout << builder->getBuilderPartB() << endl;
    cout << builder->getBuilderPartC() << endl;
}

int main(){
    Director director;
    Builder *builder = new ConcreteBuilder();
    director.Construct(builder);
    builder = new ConcreteBuilder2();
    director.Construct(builder);
    return 0;
}

 

相关文章:

  • 2022-12-23
  • 2021-10-19
  • 2021-09-20
  • 2021-04-21
  • 2021-08-13
  • 2022-03-09
  • 2022-12-23
  • 2023-02-09
猜你喜欢
  • 2021-12-20
  • 2021-10-23
  • 2021-04-30
  • 2021-10-04
  • 2021-12-13
  • 2021-11-07
  • 2022-12-23
相关资源
相似解决方案