设计模式-抽象工厂模式

设计模式-抽象工厂模式

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

概述

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

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

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

优点:

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

缺点:

  • 产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 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!
相关推荐
Edingbrugh.南空16 分钟前
Flink ClickHouse 连接器数据读取源码深度解析
java·clickhouse·flink
NE_STOP29 分钟前
SpringBoot--简单入门
java·spring
hqxstudying1 小时前
Java创建型模式---原型模式
java·开发语言·设计模式·代码规范
Dcs1 小时前
VSCode等多款主流 IDE 爆出安全漏洞!插件“伪装认证”可执行恶意命令!
java
保持学习ing1 小时前
day1--项目搭建and内容管理模块
java·数据库·后端·docker·虚拟机
京东云开发者2 小时前
Java的SPI机制详解
java
超级小忍2 小时前
服务端向客户端主动推送数据的几种方法(Spring Boot 环境)
java·spring boot·后端
程序无bug2 小时前
Spring IoC注解式开发无敌详细(细节丰富)
java·后端
小莫分享2 小时前
Java Lombok 入门
java
程序无bug2 小时前
Spring 对于事务上的应用的详细说明
java·后端