• 第十三章-建造者模式


    建造者模式(Builder): 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

    它主要是用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的,但对象内部的构造通常面临着复杂的变化。
    建造者模式的好处就是使得建造代码与表示代码分离,由于建造者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了。

    图片

    基本代码

    #include<iostream>
    #include<string>
    #include<vector>
    
    using namespace std;
    
    //Product类,产品类,由多个部件组成
    class Product
    {
    private:
    	vector<string> parts;
    
    public:
    	void add(string part)
    	{
    		parts.push_back(part);
    	}
    
    	void show()
    	{
    		cout << "
    产品  创建------";
    		for (auto _i : parts)
    			cout << _i;
    	}
    };
    
    //Builder类---抽象建造者类,确定产品由两个部件PartA和PartB组成,并声明一个得到产品建造后结果的方法GetResult
    class Builder
    {
    public:
    	virtual void BuildPartA() = 0;
    	virtual void BuildPartB() = 0;
    	virtual Product* GetResult() = 0;
    };
    
    //具体建造者类
    class ConcreteBuilder1 :public Builder
    {
    private:
    	Product *product;
    
    public:
    	ConcreteBuilder1()
    	{
    		product = new Product();
    	}
    
    	void BuildPartA()
    	{
    		product->add("部件A");
    	}
    
    	void BuildPartB()
    	{
    		product->add("部件B");
    	}
    
    	Product* GetResult()
    	{
    		return product;
    	}
    };
    
    class ConcreteBuilder2 :public Builder
    {
    private:
    	Product *product;
    
    public:
    	ConcreteBuilder2()
    	{
    		product = new Product();
    	}
    
    	void BuildPartA()
    	{
    		product->add("部件X");
    	}
    
    	void BuildPartB()
    	{
    		product->add("部件Y");
    	}
    
    	Product* GetResult()
    	{
    		return product;
    	}
    };
    
    //指挥类,用来控制建造过程,也用它来隔离用户与建造过程
    class Director
    {
    public:
    	void Construct(Builder* builder)
    	{
    		builder->BuildPartA();
    		builder->BuildPartB();
    	}
    };
    
    int main()
    {
    	Director* director = new Director();
    	Builder* b1 = new ConcreteBuilder1();
    	Builder* b2 = new ConcreteBuilder2();
    
    	director->Construct(b1);
    	Product* p1 = b1->GetResult();
    	p1->show();
    
    	director->Construct(b2);
    	Product* p2 = b2->GetResult();
    	p2->show();
    
    	system("pause");
    	return 0;
    }
    
    
    
  • 相关阅读:
    MindMup 是一个开源的、在线的、简单的思维导图工具
    那些年我们用过的Python代码
    我心目中要求不高的理想团队
    与雨林再辩科学、宗教和道
    MySQL(一) 数据表数据库的基本操作
    hibernate(六) cascade(级联)和inverse关系详解
    java虚拟机内存区域的划分以及作用详解
    MySQL(二) 数据库数据类型详解
    MySQL(三) 数据库表的查询操作【重要】
    MySQL(四) 数据表的插入、更新、删除数据
  • 原文地址:https://www.cnblogs.com/wfcg165/p/12011239.html
Copyright © 2020-2023  润新知