首页 > 代码库 > 设计模式:构建器模式(Builder)

设计模式:构建器模式(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; 
}





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