关闭

建造者模式

336人阅读 评论(0) 收藏 举报
分类:
定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

类图:

四个要素

  • 产品类:一般是一个较为复杂的对象,也就是说创建对象的过程比较复杂,一般会有比较多的代码量。在本类图中,产品类是一个具体的类,而非抽象类。实际编程中,产品类可以是由一个抽象类与它的不同实现组成,也可以是由多个抽象类与他们的实现组成。
  • 抽象建造者:引入抽象建造者的目的,是为了将建造的具体过程交与它的子类来实现。这样更容易扩展。一般至少会有两个抽象方法,一个用来建造产品,一个是用来返回产品。
  • 建造者:实现抽象类的所有未实现的方法,具体来说一般是两项任务:组建产品;返回组建好的产品。

  • 导演类:负责调用适当的建造者来组建产品,导演类一般不与产品类发生依赖关系,与导演类直接交互的是建造者类。一般来说,导演类被用来封装程序中易变的部分。

建造者模式的优点

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

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

 

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

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

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

 

总结

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

class Product{  
public:  
	Product(){};  
	~Product(){};  
  
    void setPartA(int param);  
    void setPartB(int param);  
    void setPartC(int param); 
	void setPartD(int param);
  
    void show();  
  
private:  
    int partA;  
    int partB;  
    int partC;
	int partD;
  
};  
  
void Product::setPartA(int param)  
{  
    partA = param;  
}  
  
  
void Product::setPartB(int param)  
{  
    partB = param;  
}  
  
  
void Product::setPartC(int param)  
{  
    partC = param;  
}  
void Product::setPartD(int param)
{
	partD = param;
}
  
void Product::show()  
{  
    fprintf(stderr,"partA = %d  partB = %d  partC = %d  partD = %d\n",partA,partB,partC, partD);  
} 
  
class AbstractBuilder{  
public:  
	AbstractBuilder(){};  
	virtual ~AbstractBuilder(){};  
  
    virtual void createProduct() = 0;  
    virtual void buildPartA(int param) = 0;  
    virtual void buildPartB(int param) = 0;  
    virtual void buildPartC(int param) = 0;
	virtual void buildPartD(int param) = 0;  
  
    virtual Product* getProduct() = 0;  
};  
  
  
class Builder: public AbstractBuilder{  
public:  
	Builder(){};  
	~Builder(){};  
  
	void createProduct();
    void buildPartA(int param);  
    void buildPartB(int param);  
    void buildPartC(int param); 
	void buildPartD(int param); 
  
    Product* getProduct();  
  
private:  
    Product* curProduct;  
  
};  


void Builder::createProduct()  
{  
    cout<<"create a parent product\n"<<endl;  
    curProduct = new Product();  
}  
 
  
void Builder::buildPartA(int param)  
{  
    cout<<"create the A part"<<endl;  
    curProduct->setPartA(param);  
}  
  
  
void Builder::buildPartB(int param)  
{  
    cout<<"create the B part"<<endl;  
    curProduct->setPartB(param);  
}  
  
  
void Builder::buildPartC(int param)  
{  
    cout<<"create the C part"<<endl;  
    curProduct->setPartC(param);  
}  
  
void Builder::buildPartD(int param)  
{  
    cout<<"create the D part"<<endl;  
    curProduct->setPartD(param);  
}  

Product* Builder::getProduct()  
{      
    return curProduct;  
} 

  
class Director  
{  
public:  
	Director(AbstractBuilder* builder):curBuilder(builder){};  
	~Director(){};  
  
    void construct();  
  
private:  
    AbstractBuilder* curBuilder;  
};  
     
  
  
void Director::construct()  
{  
    if (!curBuilder)  
        return;  
  
    curBuilder->createProduct();  
    curBuilder->buildPartA(1);  
    curBuilder->buildPartB(2);  
    curBuilder->buildPartC(3);
	curBuilder->buildPartD(4);  
}  

  
  
int main()  
{  
	cout<<"\n--------------start of the main()---------------"<<endl;
    AbstractBuilder* builder = new Builder();  
    Director* director = new Director(builder);  
  
    director->construct(); //director contruct a product 
      
    Product* product = builder->getProduct();  
    product->show();  

	cout<<"\n--------------end of the main()---------------"<<endl;
    return 0;  
}  







1
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

oracle模式结构外模式、模式和内模式

三级模式结构:外模式、模式和内模式 一、模式(Schema) 定义:也称逻辑模式,是数据库中全体数据的逻辑结构和特征的描述,是所有用户的公共数据视图。 理解: ① 一个数据库只...
  • u012164093
  • u012164093
  • 2016-09-17 20:52
  • 637

创建模式、结构模式、行为模式的区别

创建模式 创建型模式,就是创建对象的模式,抽象了实例化的过程。  它帮助一个系统独立于如何创建、组合和表示它的那些对象。  关注的是对象的创建,创建型模式将创建对象的过程进行了抽象,也可...
  • AlbertFly
  • AlbertFly
  • 2016-08-22 16:37
  • 1045

设计模式读书笔记-----建造者模式

流水作业大家应该都清楚吧!在流水作业中,我们可以将一些复杂的东西给构建出来,例如汽车。我们都知道汽车内部构件比较复杂,由很多部件组成,例如车轮、车门、发动机、方向盘等等,对于我们用户来说我们并不需要知...
  • chenssy
  • chenssy
  • 2013-09-07 21:22
  • 8467

菜鸟版JAVA设计模式—适配器模式,装饰模式,代理模式异同

节前把3个设计模式的学习心得分享了一下,分别是适配器模式,装饰模式,代理模式。 但是似乎越写越有些迷糊,这三种模式都有着一些大同小异的地方,总是有些搞不清。 今天再重新学习下,把学习心得分享给大家一下...
  • lulei9876
  • lulei9876
  • 2014-10-14 10:55
  • 12047

装饰模式、装饰器模式、代理模式、外观模式区别

装饰器模式关注于在一个对象上动态的添加方法,然而代理模式关注于控制对对象的访问。 用代理模式,代理类可以对它的客户隐藏一个对象的具体信息。因此,当使用代理模式的时候,我们常常在一个代理类中创建一个对象...
  • zhang31jian
  • zhang31jian
  • 2016-01-18 17:21
  • 2315

【设计模式之三:模式对比】外观模式、代理模式与中介者模式的区别

外观模式 个人理解:         子类继承外观类的所有属性方法,客户端只需要跟外观类进行交流,实现了对所有子类的封装。 没有使用外观类 如图:         应用外观类 ...
  • cangchen
  • cangchen
  • 2015-04-08 23:05
  • 2674

几个工厂模式和门面模式

设计模式中最搞的就是简单工厂模式、抽象工厂模式、工厂方法·和门面模式 先看一下他们的定义吧: 简单工厂: 定义 :   提供一个创建对象实例...
  • u010681276
  • u010681276
  • 2015-02-25 21:27
  • 651

结构型设计模式(一)(适配器模式,桥接模式,组合模式,装饰模式)

结构模式用来描述的是如何组合类 的对象一获得更大的结构,分为类描述和对象描述。类描述的是如何通过继承提供更有用的接口而对象接口描述的是通过使用对象的组合或将对象含在其他对象里面一伙的更有用的结构》 ...
  • l_z_w99
  • l_z_w99
  • 2016-12-30 18:37
  • 625

Java模式之装饰者模式&代理模式 装饰模式与代理模式区别

1.2.2 装饰模式:就是可以动态的在目标对象中添加一些功能,有装饰者,有被装饰者。 其实它跟代理模式特别像。               例子:可以把它理解为Spring的AOP,可以通...
  • lishijia
  • lishijia
  • 2015-03-16 21:12
  • 573

装饰者模式与外观者模式的区别

(转载)http://bbs.bccn.net/thread-216717-1-1.html 很久没有来这一个论坛里了,一上来就看到很多关于设计模式的贴子上了精,今天我也来谈一下设计模式,我现在所介绍...
  • zhuhai__yizhi
  • zhuhai__yizhi
  • 2016-03-03 09:55
  • 1091
    个人资料
    • 访问:611711次
    • 积分:7275
    • 等级:
    • 排名:第3568名
    • 原创:148篇
    • 转载:142篇
    • 译文:0篇
    • 评论:187条
    About me
    creative idea
    最新评论