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

          建造者模式,将一个复杂对象的构建与它的表示分离,使得相同的构建过程能够创建不同的表示。
          建造者模式能够将一个产品的内部表象与产品的生成过程切割开来,从而能够使一个建造过程生成具有不同的内部表象的产品对象。

    假设我们使用了建造者模式。那么用户就仅仅需指定须要建造的类型就能够得到他们,而详细建造的过程和细节就不须要知道了。


    Product就是详细产品类,由多个部件组成。
    Builder是为创建一个Product对象的各个部件指定的抽象接口。
    ConcreteBuilder是详细的建造者,实现Builder的接口。构造和装配各个部件。
    指挥者Director就是依据需求的详细建造步骤。


    建造者模式的优点就是使得建造代码与表示代码分离,因为建造者隐藏了该产品是怎样组装的,所以若须要改变一个产品的内部表示,仅仅须要再定义一个详细的建造者就能够了。

    代码:
    #include "stdafx.h"
    #include <iostream>
    #include <string>
    using namespace std;
    class Product
    {
    private:
    	std::string _partA;
    	std::string _partB;
    	std::string _partC;
    public:
    	void SetPartA(const string& partA)
    	{
    		cout << "Product:A" << endl;
    		_partA = partA;
    	}
    	void SetPartB(const string& partB)
    	{
    		cout << "Product:B" << endl;
    		_partB = partB;
    	}
    	void SetPartC(const string& partC)
    	{
    		cout << "Product:C" << endl;
    		_partC = partC;
    	}
    
    };
    
    class Builder
    {
    public:
    	virtual void BuildPartA() = 0;
    	virtual void BuildPartB() = 0;
    	virtual void BuildPartC() = 0;
    	virtual Product* GetProduct() = 0;
        Builder(){}
    	virtual ~Builder(){}
    };
    
    class ConcreteBuilder :public Builder
    {
    private:
    	Product* _pProduct;
    public:
    	ConcreteBuilder()
    		:Builder()
    	{
    		_pProduct = new Product();
    	}
    	~ConcreteBuilder()
    	{
    		delete(_pProduct);
    		_pProduct = NULL;
    	}
    	virtual void BuildPartA()
    	{
    		cout << "ConcreteBuilder:A" << endl;
    		_pProduct->SetPartA("A");
    	}
    	virtual void BuildPartB()
    	{
    		cout << "ConcreteBuilder:B" << endl;
    		_pProduct->SetPartB("B");
    	}
    	virtual void BuildPartC()
    	{
    		cout << "ConcreteBuilder:C" << endl;
    		_pProduct->SetPartC("C");
    	}
    
    	virtual Product* GetProduct()
    	{
    		return this->_pProduct;
    	}
    
    
    };
    
    class Director
    {
    private:
    	Builder *_pBuilder;
    public:
    	~Director()
    	{
    
    	}
    	Director(Builder* builder)
    	{
    		_pBuilder = builder;
    	}
    	void Construct()
    	{
    		_pBuilder->BuildPartA();
    		_pBuilder->BuildPartB();
    		_pBuilder->BuildPartC();
    	}
    };
    // BuilderPattern.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    #include "Builder.h"
    
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	Director *pDirector = new Director(new ConcreteBuilder());
    	pDirector->Construct();
    
    	getchar();
    	return 0;
    }
    



  • 相关阅读:
    linux 下的文件IO基础
    git命令-切换分支
    专利搜索引擎
    在此位置打开CMD
    2017 JAVA神器 Btrace详细介绍
    linux下的find文件查找命令与grep文件内容查找命令
    Linux如何查看JDK的安装路径
    JavaScript SetInterval与setTimeout使用方法详解
    ssh 登录出现Are you sure you want to continue connecting (yes/no)?解决方法
    ssh连接提示 "Connection closed by remote host"
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5326421.html
Copyright © 2011-2022 走看看