• 设计模式-抽象工厂模式


    设计模式-抽象工厂模式

    本文我们简单说下设计模式中的工厂方法模式

    概述

    我们知道,在工厂方法模式中,通过为每个产品创建一个工厂的方式,没增加一个产品只需要增加一个产品类,然后实现这个产品类的工厂,解决了简单工厂模式的不满足开闭原则的问题。

    那么有这么一种场景,随着工厂业务场景的增加,产品的类型也不断的增加,如果还是为每个产品都创建一个工厂类,那么代码中势必会出现大量的工厂类,增加系统的开销,也不好维护。

    此时我们就考虑,是不是可以把一些相关联的产品归纳成一个产品族,交由同一个工厂进行管理。比如,华为工厂,生产手机,路由器,平板等;小米工厂也有手机,路由器,平板等,把这些相关的产品交由同一工厂进行管理,就是抽象工厂。

    优点:

    • 当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。

    缺点:

    • 产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。

    应用场景:

    比如:我们项目中有这么一个场景:我们的标签分多个渠道,不同渠道的标签是从不同的原系统中同步过来,不同渠道的标签的同步逻辑也是不一样的。

    还有个问题就是每次同步标签之前,会先判断这个原系统的标签有没有更新,如果原系统标签有变更才会进行同步;如果原系统标签没有变更,则不进行同步,同时提示用户,标签已经是最新版本。

    我们就采用了抽象工厂模式,对不同渠道的标签、不同原系统标签判断是否有更新需要同步,交由不同渠道的工厂来管理。

    实现

    代码结构

    代码实现

    • ProductFactory
    /**
     * @Author: ITender
     * @CreateTime: 2022-02-17 23:16
     */![在这里插入图片描述](https://img-blog.csdnimg.cn/76edb7bda3204793a0e6c49c81aa3560.png#pic_center)
    
    public interface ProductFactory {
    
        /**
         * 手机产品族
         *
         * @return
         */
        PhoneProduct createPhone();
    
        /**
         * 路由器产品族
         *
         * @return
         */
        RouterProduct createRouter();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • HuaweiFactory
    /**
     * @Author: ITender
     * @Description:
     * @CreateTime: 2022-02-17 23:21
     */
    public class HuaweiFactory implements ProductFactory {
    
        @Override
        public PhoneProduct createPhone() {
            System.out.println("华为工厂,生产华为手机!");
            return new HuaweiPhone();
        }
    
        @Override
        public RouterProduct createRouter() {
            System.out.println("华为工厂,生产华为路由器!");
            return new HuaweiRouter();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • XiaomiFactory
    /**
     * @Author: ITender
     * @Description:
     * @CreateTime: 2022-02-17 23:20
     */
    public class XiaomiFactory implements ProductFactory {
    
        @Override
        public PhoneProduct createPhone() {
            System.out.println("小米工厂,生产小米手机!");
            return new XiaomiPhone();
        }
    
        @Override
        public RouterProduct createRouter() {
            System.out.println("小米工厂,生产小米路由器!");
            return new XiaomiRouter();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • PhoneProduct
    /**
     * @Author: ITender
     * @Description:
     * @CreateTime: 2022-02-17 23:04
     */
    public interface PhoneProduct {
    
        /**
         * 手机打电话
         */
        void call();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • HuaweiPhone
    /**
     * @Author: ITender
     * @Description:
     * @CreateTime: 2022-02-17 23:06
     */
    public class HuaweiPhone implements PhoneProduct {
    
        @Override
        public void call() {
            System.out.println("华为手机打电话!");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • XiaomiPhone
    /**
     * @Author: ITender
     * @Description:
     * @CreateTime: 2022-02-17 23:08
     */
    public class XiaomiPhone implements PhoneProduct {
    
        @Override
        public void call() {
            System.out.println("小米手机打电话!");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • RouterProduct
    /**
     * @Author: ITender
     * @CreateTime: 2022-02-17 23:09
     */
    public interface RouterProduct {
    
        /**
         * 路由器wifi
         */
        void wifi();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • HuaweiRouter
    /**
     * @Author: ITender
     * @Description:
     * @CreateTime: 2022-02-17 23:10
     */
    public class HuaweiRouter implements RouterProduct {
    
        @Override
        public void wifi() {
            System.out.println("华为路由器wifi!");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • XiaomiRouter
    /**
     * @Author: ITender
     * @Description:
     * @CreateTime: 2022-02-17 23:13
     */
    public class XiaomiRouter implements RouterProduct {
    
        @Override
        public void wifi() {
            System.out.println("小米路由器wifi!");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 测试代码
    /**
     * @Author: ITender
     * @Description:
     * @CreateTime: 2022-02-17 23:25
     */
    public class Consumer {
        public static void main(String[] args) {
            System.out.println("===========小米产品===============");
            XiaomiFactory xiaomiFactory = new XiaomiFactory();
            PhoneProduct xiaomiPhone = xiaomiFactory.createPhone();
            xiaomiPhone.call();
            RouterProduct xiaomiRouter = xiaomiFactory.createRouter();
            xiaomiRouter.wifi();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 输出
    ===========小米产品===============
    小米工厂,生产小米手机!
    小米手机打电话!
    小米工厂,生产小米路由器!
    小米路由器wifi!
    
    • 1
    • 2
    • 3
    • 4
    • 5
  • 相关阅读:
    【Python教学】pyqt6入门到入土系列,超详细教学讲解
    制造企业如何使用APS高级排产做好数据资产管理?
    SQL WHERE Clause(查询子句)
    HarmonyOS NEXT应用开发之深色模式适配
    Linux下备份文件到其他服务器
    flutter 设置缓存的方法
    【PyTorch】详细总结-如何创建和初始化Pytoch张量 (2022年最新)
    Leetcode 33 搜索旋转排序数组
    R语言使用ggpubr包的desc_statby函数计算不同分组的描述性统计信息、分组样本数、最小值、最大值、中位数、均值、IQR、mad、sd等
    精读大型网站架构:前端架构模块化的方法及困境,自研框架Trick
  • 原文地址:https://blog.csdn.net/Y_eatMeat/article/details/132734618