设计模式-抽象工厂模式

设计模式-抽象工厂模式

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

概述

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

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

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

优点:

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

缺点:

  • 产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 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!
相关推荐
树若逝花若殇2 分钟前
基于Spring AOP优雅记录请求响应日志
java·spring boot
Yyyyyy~29 分钟前
【java】数组的定义和使用
java
麻辣布丁30 分钟前
java集合篇面试模拟
java·开发语言·面试
niucloud-admin31 分钟前
JAVA V6 多商户商城 开发文档——插件开发规范
java·开发语言
嘟哩DuliDuli44 分钟前
创作 Agent 的任务状态该如何保存
android·java·javascript
善良勤劳勇敢而又聪明的老杨1 小时前
【AI编程系列】MCP 常用设计模式解读
设计模式·ai编程
wdfk_prog1 小时前
lely-canopen-rtt:为什么推荐在 RT-Thread 上使用 Lely CANopen 构建主站
java·运维·缓存·docker·容器
Token掘金室1 小时前
JSON模式结构化输出报错
java·服务器·json
秋饼1 小时前
Spring AI 2.0 接入 DeepSeek V4.1 Flash 生产级实战
java·ai·技术分享·后端开发
IT枫斗者枫哥1 小时前
Java 分批导出仍然 OOM?用 32 MiB 堆复现三种 CSV 写法
java