• [design pattern](6) Absract Factory


    前言

    在前面的章节中,我们先后介绍了简单工厂模式和工厂方法模式。他们都是工厂模式大家族的一员,那么,本章将会接着上一章,来说一说工厂模式的最后一员,那就是抽象工厂模式。

     思考题

    首先,来思考下下面的问题怎么实现:

    在工厂方法模式中,博主在四川和上海开了一家饭店,目前生意相当的火爆,但是还是不赚钱。分析原因发现,目前各家分店都是自己采购原料,并且很贵。那博主就不愿意了,博主决定,自己开一家生产原料的工厂。那么我们应该去实现这个工厂呢?

    要是学习了 抽象工厂模式 ,你就会很惊喜的发现,那家伙可以很好的满足我们的需求。

    抽象工厂模式

    定义:抽象工厂模式就是在抽象工厂中提供一系列的接口,用这一系列的接口创建相关或者依赖对象的家族,而不需要指定具体的类。

    类图:

    上面的类图,涉及以下几个角色:

    • 抽象产品A,B:为产品A,B定义了一些接口。
    • 具体产品A,B:抽象产品A,B的具体实现。
    • 抽象工厂:定义了一些列的接口,用于创建具体的产品A,B。
    • 具体工厂:实现了抽象工厂的一系列接口,可以生产一些相关的产品。

    思考题实现

    首先,定义抽象产品:

    Salt.java:

    public interface Salt {
        String put();
    }

    然后,定义抽象产品的实现:

    ShangHaiSalt.java:

    public class ShangHaiSalt implements Salt {
        public String put() {
            return "上海的盐";
        }
    }

    SiChuanSalt.java:

    public class SiChuanSalt implements Salt {
        public String put(){
            return "四川的盐";
        }
    }

    然后,定义抽象原料工厂:

    IngredientFactory.java:

    public interface IngredientFactory {
        Salt createSalt();
    }

    然后,实现抽象原料工厂:

    ShangHaiIngredientFactory.java:

    public class ShangHaiIngredientFactory implements IngredientFactory {
        public Salt createSalt() {
            return new ShangHaiSalt();
        }
    }

    SiChuanIngredientFactory.java:

    public class SiChuanIngredientFactory implements IngredientFactory {
        public Salt createSalt() {
            return new SiChuanSalt();
        }
    }

    然后,定义抽象产品:

    Food.java:

    public abstract class Food {
        protected IngredientFactory ingredientFactory;
    
    
        public Food(IngredientFactory ingredientFactory) {
            this.ingredientFactory = ingredientFactory;
        }
    
        public void fry() {
            System.out.println("翻炒");
        }
    
        public void eat() {
            System.out.println("吃");
        }
    
        public abstract void putSeasoning();
    }

    然后,实现抽象产品:

    KungPaoChicken.java:

    public class KungPaoChicken extends Food {
        public KungPaoChicken(IngredientFactory ingredient) {
            super(ingredient);
        }
    
        @Override
        public void putSeasoning() {
            Salt salt = ingredientFactory.createSalt();
        System.out.println("放入" + salt.put());
        }
    }

    TomatoEgg.java:

    public class TomatoEgg extends Food {
          
        public TomatoEgg(IngredientFactory ingredientFactory) {
            super(ingredientFactory);
        }
        @Override
        public void putSeasoning() {
        Salt salt = ingredientFactory.createSalt();
        System.out.println("放入" + salt.put());        
        }
    }

    然后,定义抽象工厂:

    AbstractHotal.java:

    public abstract class AbstractHotal {
        public Food saleFood(String foodName) {
            Food food = createFood(foodName);
        food.putSeasoning();
        food.fry();
        return food;
        }
    
        public abstract Food createFood(String foodName);
    }

    然后,实现抽象工厂:

    ShangHaiHotal.java:

    public class ShangHaiHotal extends AbstractHotal {
        @Override
        public Food createFood(String foodName) {
            IngredientFactory ingredient = new ShangHaiIngredientFactory();
        switch(foodName) {
            case "KungPaoChicken": 
                return new KungPaoChicken(ingredient);
            case "TomatoEgg":
                return new TomatoEgg(ingredient);
            default:
                return null;
        }
        }
    }

    SiChuanHotal.java:

    public class SiChuanHotal extends AbstractHotal {
        @Override
        public Food createFood(String foodName) {
        IngredientFactory ingredient = new SiChuanIngredientFactory();
            switch(foodName) {
            case "KungPaoChicken":
                return new KungPaoChicken(ingredient);
            case "TomatoEgg":
                return new TomatoEgg(ingredient);
            default:
                return null;
        }
        }
    }

    最后附上测试代码:

    Custom.java:

    public class Custom {
        public static void main(String ...args) {
            AbstractHotal shangHaiHotal = new ShangHaiHotal();
        AbstractHotal siChuanHotal = new SiChuanHotal();
    
        Food shangHaiKungPaoChicken = shangHaiHotal.saleFood("KungPaoChicken");
        Food shangHaiTomatoEgg = shangHaiHotal.saleFood("TomatoEgg");
    
        Food siChuanKungPaoChicken = siChuanHotal.saleFood("KungPaoChicken");
        Food siChuanTomatoEgg = siChuanHotal.saleFood("TomatoEgg");
    
        shangHaiKungPaoChicken.eat();
        shangHaiTomatoEgg.eat();
    
        siChuanKungPaoChicken.eat();
        siChuanTomatoEgg.eat();
        }
    }
  • 相关阅读:
    【自动化测试不求人】selenium三种等待时间
    Linux中vim的简单配置
    linux中解压缩并安装.tar.gz后缀的文件
    Linux命令全称
    Linux中的find(-atime、-ctime、-mtime)指令分析
    (转)docker安装Mysql8.0并挂载外部配置和数据
    自动化测试常见Python算法题&答案
    2019年的面试经验总结-软件测试
    Python基础语法
    抓包工具Charles的使用说明
  • 原文地址:https://www.cnblogs.com/cafebabe-yun/p/11420714.html
Copyright © 2020-2023  润新知