• 设计模式-建造者模式


    建造者模式Builder):

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

    1.将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
    2.建造者模式又称为生成器模式,可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。
    3.如果使用了建造者模式,那么用户就只需要制定需要建造的类型就可以得到它们,而具体的细节就不需要知道了。

    介绍上面UML图相关类:

    Builder:是一个创建小人各个部分的抽象类,概括的说是为创建一个Product对象的各个部件指定的抽象接口。
    ConcreteBuilder:具体的小人,具体实现如何画出小人的头身手脚各个部位,它是具体的建造者,实现Builder接口,构造和装配各个部件。
    Product:就是那些具体的小人,产品角色。
    Director:指挥者,用来根据用户需求构建小人对象,它是构建一个使用Builder接口的对象。


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

    建造者模式代码

    #pragma once
    #include <list>
    #include <string>
    #include <iostream>
    using namespace std;
    
    //Product类-产品类,由多个部件组成。
    class CProduct
    {
    private:
    	list<string> m_lsParts;
    public:
    	CProduct(){m_lsParts.clear();}
    	void Add(string strPart)
    	{
    		m_lsParts.push_back(strPart);
    	}
    	void Show()
    	{
    		cout<<"产品创建"<<endl;
    		for each(string i in m_lsParts)
    		{
    			cout<<i<<endl;
    		}
    	}
    };
    //Builder类-抽象建造者类,确定产品由两个部件PartA和PartB组成,并声明一个得到产品建造后结果的方法。
    class CBuilder
    {
    public:
    	virtual void BuildPartA() = 0;
    	virtual void BuildPartB() = 0;
    	virtual CProduct* GetResult() = 0;
    };
    
    //ConcreteBuilder1类-具体建造者类。
    class CConcreteBuilder1 : public CBuilder
    {
    private:
    	CProduct *m_pProduct;
    public:
    	CConcreteBuilder1(){m_pProduct = new CProduct();}
    	~CConcreteBuilder1(){delete m_pProduct;}
    
    	void BuildPartA()
    	{
    		m_pProduct->Add("部件A");
    	}
    	void BuildPartB()
    	{
    		m_pProduct->Add("部件B");
    	}
    	CProduct* GetResult()
    	{
    		return m_pProduct;
    	}
    };
    
    //ConcreteBuilder2类-具体建造者类。
    class CConcreteBuilder2 : public CBuilder
    {
    private:
    	CProduct *m_pProduct;
    public:
    	CConcreteBuilder2(){m_pProduct = new CProduct();}
    	~CConcreteBuilder2(){delete m_pProduct;}
    
    	void BuildPartA()
    	{
    		m_pProduct->Add("部件X");
    	}
    	void BuildPartB()
    	{
    		m_pProduct->Add("部件Y");
    	}
    	CProduct* GetResult()
    	{
    		return m_pProduct;
    	}
    };
    
    //Director类-指挥者类。
    class CDirector
    {
    public:
    	void Construct(CBuilder *pBuilder)
    	{
    		pBuilder->BuildPartA();
    		pBuilder->BuildPartB();
    	}
    };
    
    
    

    客户端使用代码

    // TTT.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include "Builder.h"
    #include <windows.h>
    
    using namespace std;
    
    int main()
    {
    	CDirector *pDirector = new CDirector();
    	CBuilder *pB1 = new CConcreteBuilder1();
    	CBuilder *pB2 = new CConcreteBuilder2();
    	
    	pDirector->Construct(pB1);
    	CProduct *p1 = pB1->GetResult();
    	p1->Show();
    
    	pDirector->Construct(pB2);
    	CProduct *p2 = pB2->GetResult();
    	p2->Show();
    
    	delete pDirector ;
    	delete pB1 ; delete pB2;
    	//delete p1 ; delete p2;
    
    
    	return 0;
    }

    运行结果

  • 相关阅读:
    eclipse p2更新官网wiki的例子
    打包完的rcp产品svn不储存密码问题
    hudson 使用节点打包出现ClassNotFoundException: org.jvnet.hudson.maven3.agent.Maven3Main 错误
    maven 安装第三方jar到本地 出现 The goal you specified requires a project to execute but there is no POM in this directory 错误
    利用tycho插件自动生成pom文件
    蒙特卡洛(Monte Carlo)方法求面积
    笨办法学Python(learn python the hard way)--练习程序42
    笨办法学Python(learn python the hard way)--练习程序41
    笨办法学Python(learn python the hard way)--练习程序39-40
    笨办法学Python(learn python the hard way)--练习程序31-35
  • 原文地址:https://www.cnblogs.com/csnd/p/12062345.html
Copyright © 2020-2023  润新知