美文网首页
抽象工厂模式 ~ 设计模式之六

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

作者: 喏喏2021 | 来源:发表于2022-01-12 14:52 被阅读0次

    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. 小宝忽然想吃新的菜品时,爸妈就得都要学一阵子

    相关文章

      网友评论

          本文标题:抽象工厂模式 ~ 设计模式之六

          本文链接:https://www.haomeiwen.com/subject/ffewcrtx.html