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