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

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

    类型:创建类模式

    类图:

    四个要素

    • 产品类:一般是一个较为复杂的对象,也就是说创建对象的过程比较复杂,一般会有比较多的代码量。在本类图中,产品类是一个具体的类,而非抽象类。实际编程中,产品类可以是由一个抽象类与它的不同实现组成,也可以是由多个抽象类与他们的实现组成。
    • 抽象建造者:引入抽象建造者的目的,是为了将建造的具体过程交与它的子类来实现。这样更容易扩展。一般至少会有两个抽象方法,一个用来建造产品,一个是用来返回产品。
    • 建造者:实现抽象类的所有未实现的方法,具体来说一般是两项任务:组建产品;返回组建好的产品。
    • 导演类:负责调用适当的建造者来组建产品,导演类一般不与产品类发生依赖关系,与导演类直接交互的是建造者类。一般来说,导演类被用来封装程序中易变的部分。

    代码实现

     

     header.h

    //包含头文件
    #include<iostream>
    #include<string>
    
    //引用命名空间
    using namespace std;
    
    //产品类
    class Building
    {
    	string _Name;
    	int _BuildingTime;
    public:
    	void setName(string name){_Name=name;}
    	void setTime(int time){_BuildingTime=time;}
    	void show(){cout<<"Name: "<<_Name<<"  Spend: "<<_BuildingTime<<" days."<<endl;}
    };
    
    //建造者类
    class Build
    {
    public:
    	virtual void setBuilding(string,int)=0;
    	virtual Building* getBuilding()=0;
    };
    
    //具体建造者类
    class Builder:public Build
    {
    public:
    	Builder(){BDing=new Building;}
    	void setBuilding(string name,int time){BDing->setName(name);BDing->setTime(time);}
    	Building* getBuilding(){return BDing;}
    private:
    	Building *BDing;
    };
    
    //导演类
    class Director
    {
    public:
    	Building* BuildX_bow(){
    		cout<<"building......"<<endl;
    		builder.setBuilding("X-bow",7);
    		return builder.getBuilding();
    	};
    	Building* BuildArcher_Tower(){
    		cout<<"building......"<<endl;
    		builder.setBuilding("Archer Tower",5);
    		return builder.getBuilding();};
    private:
    	Builder builder;
    };

    main.cpp

     

    #include"header.h"
    
    int main(int argc,char* argv[])
    {
    	Director myBuilder;
    	Building* b1=myBuilder.BuildX_bow();
    	b1->show();
    	Building* b2=myBuilder.BuildArcher_Tower();
    	b2->show();
    	system("pause");
    	return 0;
    }


     

    建造者模式的优点

            首先,建造者模式的封装性很好。使用建造者模式可以有效的封装变化,在使用建造者模式的场景中,一般产品类和建造者类是比较稳定的,因此,将主要的业务逻辑封装在导演类中对整体而言可以取得比较好的稳定性。

            其次,建造者模式很容易进行扩展。如果有新的需求,通过实现一个新的建造者类就可以完成,基本上不用修改之前已经测试通过的代码,因此也就不会对原有功能引入风险。

    建造者模式与工厂模式的区别

           我们可以看到,建造者模式与工厂模式是极为相似的,总体上,建造者模式仅仅只比工厂模式多了一个“导演类”的角色。在建造者模式的类图中,假如把这个导演类看做是最终调用的客户端,那么图中剩余的部分就可以看作是一个简单的工厂模式了。

           与工厂模式相比,建造者模式一般用来创建更为复杂的对象,因为对象的创建过程更为复杂,因此将对象的创建过程独立出来组成一个新的类——导演类。也就是说,工厂模式是将对象的全部创建过程封装在工厂类中,由工厂类向客户端提供最终的产品;而建造者模式中,建造者类一般只提供产品类中各个组件的建造,而将具体建造过程交付给导演类。由导演类负责将各个组件按照特定的规则组建为产品,然后将组建好的产品交付给客户端。

    总结

           建造者模式与工厂模式类似,他们都是建造者模式,适用的场景也很相似。一般来说,如果产品的建造很复杂,那么请用工厂模式;如果产品的建造更复杂,那么请用建造者模式。


  • 相关阅读:
    新浪微盘又是一个给力的产品啊,
    InfoQ: 百度数据库架构演变与设计
    列式数据库——Sybase IQ
    MapR初体验 淘宝共享数据平台 tbdata.org
    IBM正式发布新一代zEnterprise大型机(组图) 大型机,IBM,BladeCenter,美国,纽约 TechWeb News
    1TB is equal to the number of how many GB? 1PB equal to is equal to the number of TB? 1EB PB? | PCfault.com
    Cassandra vs HBase | WhyNosql
    The Hadoop Community Effect
    雅虎剥离开源软件平台 Hadoop ,与风投新建 Hortonworks 公司 品味雅虎
    RowOriented Database 、ColumnOriented Database 、KeyValue Store Database 、DocumentOriented Database
  • 原文地址:https://www.cnblogs.com/inory/p/5468667.html
Copyright © 2011-2022 走看看