1.背景
我们在做饭的过程中,发现小宝贝比较喜欢吃面条和喝汤,
喜欢妈妈的炒面和番茄鸡蛋汤,喜欢爸爸的意面和罗宋汤,当然吃的时候,我们也要配对,
吃炒面的时候喝鸡蛋汤,吃意面的时候喝罗宋汤,美极了!
这时我们发现一些特点:
- 有两种面的做法,有两种汤的做法
- 面和汤是配对的,不太好来混搭
- 一天,小宝贝忽然说,我想再换点其他吃的,估计爸妈一下子有点蒙了
- 不过,奶奶哪天来做客,凑巧,奶奶有自己的面和汤的新做法,厉害了
2. 相关角色
抽象工厂模式的主要有如下角色:
抽象工厂(Abstract Factory):提供了创建产品的接口,比如制作我们这里的面条和汤
具体工厂(Concrete Factory):主要是实现抽象工厂中的方法,生产具体的产品,比如我们的炒面和鸡蛋汤
抽象产品(Product):定义产品的规范,比如我们的面条、汤
具体产品(ConcreteProduct):实现了抽象产品角色的规范,比如我们的炒面、意面
3. 代码实现
public class AbstractFactoryPatternTest {
//抽象产品类 - 面条
static abstract class Noodle {
public abstract void eat();
}
//具体产品 - 炒面
static class FriedNoodle extends Noodle {
@Override
public void eat() {
System.out.println("我爱吃炒面");
}
}
//具体产品 - 意面
static class PastaNoodle extends Noodle {
@Override
public void eat() {
System.out.println("我爱吃意面");
}
}
//抽象产品类 - 汤
static abstract class Soup {
public abstract void eat();
}
//具体产品 - 蛋汤
static class OrangeAndEggSoup extends Soup {
@Override
public void eat() {
System.out.println("我爱喝番茄蛋汤");
}
}
//具体产品 - 罗宋汤
static class RussianSoup extends Soup {
@Override
public void eat() {
System.out.println("我爱喝罗宋汤");
}
}
//抽象工厂
static abstract class FoodFactory {
abstract Noodle getNoodle();
abstract Soup getSoup();
}
//具体工厂实现 炒面和蛋汤
static class ChineseFoodFactory extends FoodFactory {
@Override
Noodle getNoodle() {
return new FriedNoodle();
}
@Override
Soup getSoup() {
return new OrangeAndEggSoup();
}
}
//具体工厂实现 意面和罗宋汤
static class WesternFoodFactory extends FoodFactory {
@Override
Noodle getNoodle() {
return new PastaNoodle();
}
@Override
Soup getSoup() {
return new RussianSoup();
}
}
public static void main(String[] args) {
//今天星期一,吃炒面,喝蛋汤
FoodFactory ff1 = new ChineseFoodFactory();
Noodle n1 = ff1.getNoodle();
Soup s1 = ff1.getSoup();
n1.eat();
s1.eat();
//今天星期三,换换品味吃意面、罗宋汤
FoodFactory ff2 = new WesternFoodFactory();
Noodle n2 = ff2.getNoodle();
Soup s2 = ff2.getSoup();
n2.eat();
s2.eat();
}
}
//我爱吃炒面
//我爱喝番茄蛋汤
//我爱吃意面
//我爱喝罗宋汤
4. 优点
- 小宝要吃面喝汤时,只要叫一下爸或妈就行,不需要说爸爸我要吃意面,喝罗宋汤,有点多余,只要说爸我要吃面喝汤就可以了
- 奶奶来的时候,小宝可以很容易尝到第三种面、汤的口味,幸福极了
5. 缺点
- 小宝忽然想吃新的菜品时,爸妈就得都要学一阵子
网友评论