1. 背景
我们接着上次做饭的例子来说,现在宝贝忽然说是对西餐感兴趣,像什么罗宋汤,意面等。这时可能妈妈还不太会做,
妈妈说,叫你爸学,他有空,啊,这还可以,不但自己不学,还全部交给了老爸,可以的。
老爸也没有办法,既然宝贝要吃,怎么着你也得弄呀,好吃不好吃,得先整出来。
细心的你可以发现这些细节:
- 爸爸做这个西餐时,可能不能求助于妈妈的帮助,妈妈没空,可能也没有经验
- 如果妈妈不在家,既然爸爸做的不好吃,也可以将就填饱肚子
- 要做好多菜时,爸爸妈妈可以各做各的,还可以各自创意改造
2. 相关角色
工厂方法模式呢,大概包含以下4个角色:
1)抽象工厂(Abstract Factory)
爸妈都有做饭的基本能力,都可以完成各自饭菜的制作
2)具体工厂(ConcreteFactory):
这个实际爸爸做饭,或是妈妈做饭的过程
3)抽象产品(Product):
可以吃的美味食物
4)具体产品(ConcreteProduct):
实际的菜名,比如妈妈做的红烧肉,清蒸鲈鱼,爸爸做的西餐罗宋汤、意面等。
3. 代码实现
public class FactoryMethodPatternTest {
//食物抽象类
public static abstract class Food {
public String name;
public abstract void eat();
}
//清蒸鲈鱼鱼具体产品
public static class FishFood extends Food {
public FishFood(String name) {
this.name = name;
}
@Override
public void eat() {
System.out.println("享受美味的" + name);
}
}
//罗宋汤
public static class RussianSoupFood extends Food {
public RussianSoupFood(String name) {
this.name = name;
}
@Override
public void eat() {
System.out.println("享受美味的" + name);
}
}
//抽象工厂
interface FoodFactory {
public Food getFood();
}
//中餐
public static class ChineseCuisineFood implements FoodFactory{
@Override
public Food getFood() {
// TODO Auto-generated method stub
return new FishFood("清蒸鲈鱼");
}
}
//西餐
public static class WesternCuisineFood implements FoodFactory {
@Override
public Food getFood() {
return new RussianSoupFood("罗宋汤");
}
}
public static void main(String[] args) {
//我们做中餐来吃
FoodFactory ff1 = new ChineseCuisineFood();
Food f1 = ff1.getFood();
f1.eat();
//我们做西餐来吃
FoodFactory ff2 = new WesternCuisineFood();
Food f2 = ff2.getFood();
f2.eat();
}
}
4. 优点
- 我们不能将做饭的过程放在一个人身上,可以相互分担一下
- 各自负责自己的事情,可能做得更加细致清楚一点
5. 缺点
- 宝贝想要吃什么,可能要想一下,是爸爸来做,还是妈妈来做
网友评论