设计模式-建造者模式

来源:互联网 发布:unity3d如何导入fbx 编辑:程序博客网 时间:2024/06/14 17:29

建造者模式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;}
运行结果


0 0
原创粉丝点击