您的位置:首页 > 产品设计 > UI/UE

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

2014-12-01 10:34 351 查看
构建器模式有点类似于之前的抽象工厂模式,但比抽象工厂模式更强大,构建器模式可以看做由两部分组成,一是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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: