抽象工厂的分析与解决.abstract factory

先展开一个案例吧 . 网上有人用快餐和厨师来举例 , 我觉得挺好 .
问题 : 现在我要做两个套餐 , 北方人的风味和南方人的风味 ,
每个套餐都要有面 , 汤和饭 , 但是北方人吃的面 , 汤和饭和南方人的都不一样 , 北方人要辣 , 南方人要淡一点 , 我们把这些对象 , 依次定义在下面 :

北方人套餐的类 :northnuddle,northrice,northsoap;
南方人套餐的类是 : sourthnuddle,sourthrice,sourthsoap;

在没有引入这个方法之前 , 我们要得到一个北方人套餐的话我们操作如下 ;

northnuddle nn =new northnuddle();

northrice nr=new northrice();

northsoap ns=new northsoap();

南方人的套餐 :

我就不写了 .

到这里大家发现了问题 , 就是如果写下去的话 , 南方人的代码 , 几乎相同 .

那我们现在想怎么解决这个问题 .

1. 建一个方法 , 让这个方法 ( 用字符串或整形来做参数 , 将这些方法封装到一个函数里 )

makefood(string 套餐 )

if 套餐 ==’ 北 ’

{ northnuddle nn =new northnuddle();

northrice nr=new northrice();

northsoap ns=new northsoap();}

……..

这样是我们通常想到的方法 , 但这种方法一看就是一种简单工厂的处理方法 , 利用特定参数来传值 , 有更好的方法吗 , 当然有 .

就是将厨师拿出来作为一个接口 : 因为我们要做的事情就三样 , 做饭 , 做汤 , 做面条 .

这个动作 , 两种风味的厨师都要做 , 这就是共性 .

所以就出现了厨师接口 .

Public interface chef

{

noodle: makenoodle;

rice: makerice;

soap:makesoap;}

用两个子类 , 北方厨师和 , 南方厨师去继承它 , 来实现这些动作 .

Class northchef:chef;

Public makenoddle()

{ return =new makenoddle();

}

Class sourthchef:chef;

然后在 makenoodle 的函数中去构造北方的面条或南方的面条 .

这下我们就将套餐交给 ( 厨师 ) 这个抽象工厂做了 . 至于它怎么做的 , 我们不用管了 .

反正北方的厨师做的是北方的套餐 , 南方师父做的南方的套餐 .

调用的方式如下 .

Chef northChef=new NorthChef();
northChef.MakeNoodle();
northChef.MakeRice();
northChef.MakeBread();

Chef southChef=new SouthChef();
southChef.MakeBread();
southChef.MakeNoodle();
southChef.MakeRice();

Published At
Categories with Web编程
Tagged with
comments powered by Disqus