抽象工厂模式 ~ 设计模式之六

2022-01-12  本文已影响0人  喏喏2021

1.背景

我们在做饭的过程中,发现小宝贝比较喜欢吃面条和喝汤,
喜欢妈妈的炒面和番茄鸡蛋汤,喜欢爸爸的意面和罗宋汤,当然吃的时候,我们也要配对,
吃炒面的时候喝鸡蛋汤,吃意面的时候喝罗宋汤,美极了!
这时我们发现一些特点:

  1. 有两种面的做法,有两种汤的做法
  2. 面和汤是配对的,不太好来混搭
  3. 一天,小宝贝忽然说,我想再换点其他吃的,估计爸妈一下子有点蒙了
  4. 不过,奶奶哪天来做客,凑巧,奶奶有自己的面和汤的新做法,厉害了

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. 优点

  1. 小宝要吃面喝汤时,只要叫一下爸或妈就行,不需要说爸爸我要吃意面,喝罗宋汤,有点多余,只要说爸我要吃面喝汤就可以了
  2. 奶奶来的时候,小宝可以很容易尝到第三种面、汤的口味,幸福极了

5. 缺点

  1. 小宝忽然想吃新的菜品时,爸妈就得都要学一阵子
上一篇 下一篇

猜你喜欢

热点阅读