zoukankan      html  css  js  c++  java
  • 第13章建造者模式

    一 概念

    • 当需要将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示的意图时,我们需要应用于一个设计模式,建造者模式,又叫生成器模式,建造者模式可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。如果我们使用了建造者模式,那么用户就只需要建造的类型就可以得到他们,而具体建造的过程和细节就不需要知道了。

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

    二 角色

    • Builder 是为创建一个Product对象的各个部件制定的抽象接口
    • ConcreteBuilder 是具体的创建者,实现Builder接口,构造和装配各个部件
    • Product 具体的产品角色
    • Director 指挥者,他是构建一个使用Builder接口的对象

    三 C++代码实现

    //建造者模式
    #include "pch.h"
    #include <iostream>
    #include <string>
    #include <vector>
    using namespace std;
    
    //产品类-由多个部件组成
    class Product
    {
    public:
    	void Add(string part)  //添加产品部件
    	{
    		parts.push_back(part);
    	}
    	void Show()  //列举所有的产品部件
    	{
    		cout << "
    产品 创建 --" << endl;
    		for (vector<string>::iterator it = parts.begin(); it != parts.end(); ++it)
    		{
    			cout << *(it) << endl;
    		}
    	}
    private:
    	vector<string> parts;
    };
    //Builder类-抽象建造者类,确定产品由两个部件PartA和PartB组成
    //并声明一个得到产品建造后结果的方法GetResult
    class Builder
    {
    public:
    	virtual void BuildPartA() = 0;
    	virtual void BuildPartB() = 0;
    	virtual Product* GetResult() = 0;
    };
    
    //具体建造者类
    class ConcreteBuilder1 : public Builder
    {
    public:
    	ConcreteBuilder1()
    	{
    		product = new Product;
    	}
    	~ConcreteBuilder1()
    	{
    		delete product;
    	}
    	void BuildPartA() override
    	{
    		product->Add("部件A");
    	}
    	void BuildPartB() override
    	{
    		product->Add("部件B");
    	}
    	Product* GetResult() override
    	{
    		return product;
    	}
    private:
    	Product* product;
    
    };
    
    //具体建造者类
    class ConcreteBuilder2 : public Builder
    {
    public:
    	ConcreteBuilder2()
    	{
    		product = new Product;
    	}
    	~ConcreteBuilder2()
    	{
    		delete product;
    	}
    	void BuildPartA() override
    	{
    		product->Add("部件X");
    	}
    	void BuildPartB() override
    	{
    		product->Add("部件Y");
    	}
    	Product* GetResult() override
    	{
    		return product;
    	}
    private:
    	Product* 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;
    
    	//指挥者用ConcreteBuilder1的方法来建造产品
    	director->Construct(b1);
    	Product* p1 = b1->GetResult();
    	p1->Show();
    	//指挥者用ConcreteBuilder2的方法来建造产品
    	director->Construct(b2);
    	Product* p2 = b2->GetResult();
    	p2->Show();
        
    	system("pause");
    
    	return 0;
    }
    
    

    参考资料
    1 《大话设计模式C++实现-第13章-建造者模式》 https://blog.csdn.net/xiqingnian/article/details/42005627
    2 《大话设计模式》 程杰 著

  • 相关阅读:
    如何判断 DataRow 中是否存在某列????
    jquery操作table中的tr,td的方法双击dblclick attr parent id原创
    oracle 取当天日期减一天 应该如何写
    走出“搜索引擎营销”三个误区
    解决方案是什么
    强制远程连接 命令
    ORACLE 异常错误处理
    HttpClient是否有默认并发数限制?
    多线程下载程序的功能需求
    STL线程库简介
  • 原文地址:https://www.cnblogs.com/Manual-Linux/p/11121394.html
Copyright © 2011-2022 走看看