设计模式-抽象工厂模式

设计模式-抽象工厂模式

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

概述

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

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

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

优点:

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

缺点:

  • 产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 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!
相关推荐
wuqingshun31415910 分钟前
MYSQL的乐观锁和悲观锁是什么?
java
唐青枫1 小时前
Java SLF4J 实战指南:从日志门面到 Logback、MDC 和链路追踪
java
jvmind_dev1 小时前
Java GC 实战指南(番外篇):被忽视的隐形杀手 —— Class Unloading 如何拖垮 GC
java·后端
An_s1 小时前
机器学习python之识别图中物品信息
java·linux·开发语言
AIGS0012 小时前
跨越语义鸿沟:企业本体语义平台的构建与落地
java·人工智能·python·机器学习·人工智能ai大模型应用
蓝田~3 小时前
大模型本地部署与远程调用 — 从 API 到 Agent
java·人工智能·claude·claude code
码农进化录3 小时前
Java 程序员的 AI 进化论 | Spring Boot 接入 OpenAI 的六个坑,全帮你踩了
java·spring boot·openai
疯狂成瘾者3 小时前
Java 常见集合方法
java·windows·python
从此以后自律3 小时前
ConcurrentHashMap 超详细详解
java
CaffeinePro3 小时前
四⼤极简架构原则KISS/DRY/YAGNI/LOD
设计模式·架构