设计模式:构建器模式(Builder)

构建器模式有点类似于之前的抽象工厂模式,但比抽象工厂模式更强大,构建器模式可以看做由两部分组成,一是builder,二是director,builder的基本思想就是抽象工厂,而director的存在是为了使得对builder的使用更加灵活,下面是builder的代码示例:

class A {
public:
	int i;
	A() : i(1) {};
};

class B {
public:
	char c;
	B() : c('a') {};
};

class AB {
public:
	A a;
	B b;
};

class Builder {
protected:
AB* p;
public:
	Builder() { p = new AB(); }
	virtual void addABy1() = 0;
	virtual void addABy2() = 0;
	virtual void addBBy1() = 0;
	virtual void addBBy2() = 0;
	AB* getAB() { return p; }
};

class Builder1 : public Builder {
public:
	void addABy1() { p->a.i += 1; }
	void addABy2() { p->a.i += 2; }
	void addBBy1() { p->b.c += 1; }
	void addBBy2() { p->b.c += 2; }
};

class Builder2 : public Builder {
public:
	void addABy1() { p->a.i += 1*3; }
	void addABy2() { p->a.i += 2*3; }
	void addBBy1() { p->b.c += 1*3; }
	void addBBy2() { p->b.c += 2*3; }
};

A、B、AB并不是我们要关注的重点,A、B可以看做是AB的组件,builder的作用就是创建AB的对象,不同的builder根据自己的需求以不同的方式创建AB的对象,在上述代码中有一个基类Builder,它给派生类提供了一系列接口,两个派生类Builder1和Builder2分别重定义了这些接口,如果客户程序员需要以其他方式创建AB的对象,也可以定义其他的派生Builder。可以看到,Builder基本上就是基于抽象工厂模式。

构建器的强大之处在于还有一个director,注意到Builder中有两个处理A的方法:addABy1和addABy2,这就提供了一种选择,是使用前者还是使用后者,事实上,director就是做这件事的主,因此说director的存在使得对builder的使用更加灵活,可以看看director的代码:

class Constructor {
Builder *pc;
public:
	Constructor(Builder *q) : pc(q) {}
	void construct();
};

void Constructor::construct() {
	pc->addABy1();
	pc->addBBy2();
};

这里的Constructor就是一个director,它保存了指向某个Builder的指针,并在construct()中使用这个指针来选择合适的方法去构建AB的对象,也就是说Builder先弄了个AB的毛坯,提供了一系列处理这个毛坯的方法,最后由Constructor选用喜欢的方法来处理这个毛坯,最终得到个成品。构建器模式的使用示例如下:

int main() { 

	Builder *p = new Builder1();
	Constructor c(p);
	c.construct();

	return 0;
}
时间: 2024-08-11 23:11:11

设计模式:构建器模式(Builder)的相关文章

构建器模式

*构建器模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.类图如下: *product产品类:表示被构建器构建的复杂对象,包含多个部件. 1 //产品接口 示意性产品,所以没有任何方法 2 public interface Product{ 3 } *builder构建器接口:定义创建一个product对象所需要的各个部件的操作. 1 //生成器接口 2 public interface Builder{ 3 public void builderPart1();

Java构建器模式

当创建对象需要传入多个参数的时候我们通常会根据参数的数量写不同的构造器,具体如下 public A(int a){} public A(int a, int b){} public A(int a, int b, int c){} 根据不同的参数调用不同的构造器,但是当参数多了的时候,这种方式不够灵活,所以会实现动态传参的方法 public A(){} public void seta(int a){} public void setb(int b){} public void setc(int

6. 星际争霸之php设计模式--建造器模式

题记==============================================================================本php设计模式专辑来源于博客(jymoz.com),现在已经访问不了了,这一系列文章是我找了很久才找到完整的,感谢作者jymoz的辛苦付出哦! 本文地址:http://www.cnblogs.com/davidhhuan/p/4248181.html============================================

说说设计模式~装饰器模式(Decorator)

装饰器模式,也叫又叫装饰者模式,顾名思义,将一个对象进行包裹,包装,让它变成一个比较满意的对象,这种模式在我们平时项目开发中,经常会用到,事实上,它是处理问题的一种技巧,也很好的扩展了程序,让程序代码不那么死板! 何时能用到它? 1. 需要扩展一个类的功能,或给一个类添加附加职责. 2. 需要动态的给一个对象添加功能,这些功能可以再动态的撤销. 3. 需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实. 4. 当不能采用生成子类的方法进行扩充时. 其中我们认为第四种

PHP设计模式-装饰器模式

1.概念: 装饰器模式又叫做装饰者模式,是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.传统的编程模式都是子类继承父类实现方法的重载,使用装饰器模式,只需添加一个新的装饰器对象,更加灵活,避免类数目和层次过多. 2.角色: Component(被装饰对象基类):定义一个对象接口,以规范准备接受附加责任的对象. ConcreteComponent(具体被装饰对象):具体组件角色,即将要被装饰增加功能的类. Decorator(装饰者基类):装饰器接口. ConcreteDecor

构建者模式-Builder

构建者模式-Builder Builder模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细地控制对象的构造流程.该模式是为了将构建复杂对象的过程和它的部件解耦,使得构建过程和部件的表示隔离开来 Builder接口 定义了构建者的方法. public interface Builder { void makeTitle(String title); void makeString(String str); void makeItems(String[]

设计模式---对象创建模式之构建器模式(Builder)

一:概念 Builder模式也叫建造者模式或者生成器模式,是由GoF提出的23种设计模式中的一种.Builder模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象. 对象的创建:Builder模式是为对象的创建而设计的模式 创建的是一个复合对象:被创建的对象为一个具有复合属性的复合对象 关注对象创建的各部分的创建过程:不同的工厂(这里指builder生成器)对产品属性有不同的创建方法. 二:动机 在软件

Java设计模式:Builder(构建器)模式

基本概念 Builder模式是一步一步创建一个复杂对象的创建型模式.该模式将构建复杂对象的过程和它的部件解耦,使得构建过程和部件的表示隔离开来. 应用场景 对象创建过程比较复杂,或对创建顺序或组合有依赖(经典Builder模式,可参阅GOF<设计模式>). 创建对象时所需参数较多,且包含较多可选参数(变种Builder模式,可参阅<Effective Java>构建器小节). 示例代码 本节侧重变种Builder模式,示例代码如下: public class RobustPerso

设计模式-装饰器模式

前言 点击查看:设计模式系列 装饰器模式(Decorator) 定义:不通过派生类增改类属性动作,而是通过模式设计动态的达到这种效果,而且比继承更方便灵活减少程序的复杂性. 举例: 汪峰打造冠军团队. 首先团队类为空,经过汪峰不断的努力,为团队争取学员,也为团队队员打造合适的平台,让其发挥. 团队不断的变强,变完整,是由装饰者,根据不同的需求,给基类进行增改,一致最后赢得你的赞同,满足你的需求. 实现装配器模式的类图: 战队组建代码 //汪峰战队 abstract class WangFengT