设为首页 加入收藏

TOP

建造者模式
2014-11-23 22:04:15 来源: 作者: 【 】 浏览:0
Tags:建造 模式

前序
小菜和大鸟两人出去吃夜宵,大鸟要了份炒饭,小菜要了份炒面。炒完后大鸟看到炒面感觉不错,于是也叫了一份。大鸟尝后感觉淡而无味,于是便问小菜:“为什么你的炒面好吃,而我再要的炒面却没有放盐?这好吃不好吃是由谁决定的?”小菜答道:“当然是烧菜的人,他感觉好,就是一盘好面,要是心情不好,或者粗心大意,就是一盘垃圾。”“:)好,那再想想,老麦老肯他们的产品,味道是由什么决定的?”“我知道,那是由他们的工作流程决定的,由于他们制定了非常规范的工作流程,原料放多少,加热几分钟,都有严格规定,估计放多少盐都是用克来计量的。而这个工作流程是在所有的门店都必须要遵照执行的,所以我们吃到的东西不管在哪在什么时候味道都一样。这里我们要吃的食物都依赖工作流程。”

于是大鸟出题让小菜实现一个画小人的程序。

建造小人第一版
#include

class Graphics

{

public:

void DrawEllipse(int x1,int y1,int x2,int y2)

{

printf("DrawEllipse %d,%d,%d,%d ",x1,y1,x2,y2);

}

void DrawRectangle(int x1,int y1,int x2,int y2)

{

printf("DrawRectangle %d,%d,%d,%d ",x1,y1,x2,y2);

}

void DrawLine(int x1,int y1,int x2,int y2)

{

printf("DrawLine %d,%d,%d,%d ",x1,y1,x2,y2);

}

};

class PersonThinBuilder

{

public:

PersonThinBuilder(Graphics _g) : g(_g){}

void Build()

{

g.DrawEllipse(50,20,30,30);

g.DrawRectangle(60,50,10,50);

g.DrawLine(60,50,40,100);

g.DrawLine(70,50,90,100);

g.DrawLine(60,100,45,150);

g.DrawLine(70,100,85,150);

}

protected:

Graphics g;

};

class PersonFatBuilder

{

public:

PersonFatBuilder(Graphics _g) : g(_g){}

void Build()

{

g.DrawEllipse(50,20,30,30);

g.DrawEllipse(60,50,10,50);

g.DrawLine(60,50,40,100);

g.DrawLine(70,50,90,100);

g.DrawLine(60,100,45,150);

g.DrawLine(70,100,85,150);

}

protected:

Graphics g;

};

int main()

{

Graphics gThin,gFat;

PersonThinBuilder* ptb = new PersonThinBuilder(gThin);

ptb->Build();

PersonFatBuilder* pfb = new PersonFatBuilder(gFat);

pfb->Build();

delete ptb;

delete pfb;

return 0;

}

“炒面忘记放盐的问题依然没有解决。比如我们现在需要你加一个高个的小人,你会不会因为编程不注意,又让他缺胳膊少腿呢?”

“是呀,最好的办法是规定,凡是建造小人,都必须要有头和身体,以及两收两脚。”

建造者模式
将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同的内部表象的产品对象。建造模式使得产品内部表象可以独立的变化,客户不必知道产品内部组成的细节。建造模式可以强制实行一种分步骤进行的建造过程。

实现方式(UML类图)

\
实现代码
#include

class Graphics

{

public:

void DrawEllipse(int x1,int y1,int x2,int y2)

{

printf("DrawEllipse %d,%d,%d,%d ",x1,y1,x2,y2);

}

void DrawRectangle(int x1,int y1,int x2,int y2)

{

printf("DrawRectangle %d,%d,%d,%d ",x1,y1,x2,y2);

}

void DrawLine(int x1,int y1,int x2,int y2)

{

printf("DrawLine %d,%d,%d,%d ",x1,y1,x2,y2);

}

};

class PersonBuilder

{

public:

PersonBuilder(Graphics _g) : g(_g){}

virtual void BuildHead()=0;

virtual void BuildBody()=0;

virtual void BuildArmLeft()=0;

virtual void BuildArmRight()=0;

virtual void BuildLegLeft()=0;

virtual void BuildLegRight()=0;

protected:

Graphics g;

};

class PersonThinBuilder : public PersonBuilder

{

public:

PersonThinBuilder(Graphics g) : PersonBuilder(g){}

virtual void BuildHead()

{

g.DrawEllipse(50,20,30,30);

&n

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇我也要学C语言-第十四章:指针与.. 下一篇Muduo网络编程示例之十:socks4a ..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: