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

来源:互联网 发布:java电商平台开源代码 编辑:程序博客网 时间:2024/04/19 17:16

构建器模式有点类似于之前的抽象工厂模式,但比抽象工厂模式更强大,构建器模式可以看做由两部分组成,一是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; }





1 0
原创粉丝点击