设计模式-抽象工厂模式

设计模式-抽象工厂模式

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

概述

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

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

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

优点:

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

缺点:

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

应用场景:

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

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

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

实现

代码结构

代码实现

  • ProductFactory
java 复制代码
/**
 * @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();
}
  • HuaweiFactory
java 复制代码
/**
 * @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();
    }
}
  • XiaomiFactory
java 复制代码
/**
 * @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();
    }
}
  • PhoneProduct
java 复制代码
/**
 * @Author: ITender
 * @Description:
 * @CreateTime: 2022-02-17 23:04
 */
public interface PhoneProduct {

    /**
     * 手机打电话
     */
    void call();
}
  • HuaweiPhone
java 复制代码
/**
 * @Author: ITender
 * @Description:
 * @CreateTime: 2022-02-17 23:06
 */
public class HuaweiPhone implements PhoneProduct {

    @Override
    public void call() {
        System.out.println("华为手机打电话!");
    }
}
  • XiaomiPhone
java 复制代码
/**
 * @Author: ITender
 * @Description:
 * @CreateTime: 2022-02-17 23:08
 */
public class XiaomiPhone implements PhoneProduct {

    @Override
    public void call() {
        System.out.println("小米手机打电话!");
    }
}
  • RouterProduct
java 复制代码
/**
 * @Author: ITender
 * @CreateTime: 2022-02-17 23:09
 */
public interface RouterProduct {

    /**
     * 路由器wifi
     */
    void wifi();
}
  • HuaweiRouter
java 复制代码
/**
 * @Author: ITender
 * @Description:
 * @CreateTime: 2022-02-17 23:10
 */
public class HuaweiRouter implements RouterProduct {

    @Override
    public void wifi() {
        System.out.println("华为路由器wifi!");
    }
}
  • XiaomiRouter
java 复制代码
/**
 * @Author: ITender
 * @Description:
 * @CreateTime: 2022-02-17 23:13
 */
public class XiaomiRouter implements RouterProduct {

    @Override
    public void wifi() {
        System.out.println("小米路由器wifi!");
    }
}
  • 测试代码
java 复制代码
/**
 * @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();
    }
}
  • 输出
text 复制代码
===========小米产品===============
小米工厂,生产小米手机!
小米手机打电话!
小米工厂,生产小米路由器!
小米路由器wifi!
相关推荐
别动我齐刘海4 小时前
C++ 工程化学习
java·linux·前端·c++·学习·机器学习·机器人
code2cat5 小时前
Java进阶篇之AtomicLongFieldUpdater:把累计额度留在对象字段中
java·cas·并发编程
WeiXin_DZbishe5 小时前
基于springboot城市公交实时运营与调度系统-计算机毕设 附源码【课程设计】66173
java·vue.js·spring boot·后端·python·php·课程设计
泡茶喝茶写代码5 小时前
A股量化数据工程:从 REST 接口到策略信号(第 18 篇):放量缩量异动扫描
java·python·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
wewowilling6 小时前
认识微服务
java·运维·微服务·springcloud
代码什么用6 小时前
Java Web 7-10
java·servlet
蜗牛互联网7 小时前
GPT-6 与 Intelligent UI:从回答到可审计操作的产品迁移
java·人工智能·后端
SL_staff8 小时前
运维救火实录:钉钉考勤API变更引发工资计算异常,我们用JVS-Logic可视化逻辑引擎实现分钟级热修复
java·mysql·全栈
SunnyDays10118 小时前
Java 查找并高亮 Word 文字:精确查找及正则表达式模糊查找
java·查找文字·word 文档·高亮文字·正则匹配查找·模糊查找