设计模式-抽象工厂模式

设计模式-抽象工厂模式

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

概述

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

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

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

优点:

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

缺点:

  • 产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 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!
相关推荐
甜甜的资料库29 分钟前
基于微信小程序的作业管理系统源码数据库文档
java·数据库·微信小程序·小程序
有梦想的骇客6 小时前
书籍“之“字形打印矩阵(8)0609
java·算法·矩阵
yours_Gabriel7 小时前
【java面试】微服务篇
java·微服务·中间件·面试·kafka·rabbitmq
hashiqimiya8 小时前
android studio中修改java逻辑对应配置的xml文件
xml·java·android studio
liuzhenghua669 小时前
Python任务调度模型
java·运维·python
結城9 小时前
mybatisX的使用,简化springboot的开发,不用再写entity、mapper以及service了!
java·spring boot·后端
小前端大牛马9 小时前
java教程笔记(十一)-泛型
java·笔记·python
东阳马生架构9 小时前
商品中心—2.商品生命周期和状态的技术文档
java
星辰离彬9 小时前
Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解
java·spring boot·后端·sql·mysql·性能优化
q_19132846959 小时前
基于Springboot+Vue的办公管理系统
java·vue.js·spring boot·后端·intellij idea