热门标签 | HotTags
当前位置:  开发笔记 > 开发工具 > 正文

设计模式03抽象工厂模式

参考源https:www.bilibili.comvideoBV1mc411h719?p4&vd_source299f4bc123b19e7d6f66fefd8f124a03htt

参考源


https://www.bilibili.com/video/BV1mc411h719?p=4&vd_source=299f4bc123b19e7d6f66fefd8f124a03

https://www.bilibili.com/video/BV1u3411P7Na?spm_id_from=333.999.0.0&vd_source=299f4bc123b19e7d6f66fefd8f124a03




抽象工厂模式(Abstract Factory Pattern)属于创建型模式


抽象工厂模式是围绕一个超级工厂创建其他工厂,该超级工厂又称为其他工厂的工厂。

在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类,每个生成的工厂都能按照工厂模式提供对象。

前面的工厂模式通过定义顶层抽象工厂类,通过继承的方式,针对于每一个产品都提供一个工厂类用于创建。

不过这种模式只适用于简单对象,当需要生产许多个产品族的时候,这种模式就有点乏力了,比如:

image-20220521162444703

实际上这些产品都是成族出现的,比如小米的产品线上有小米手机、小米平板等,华为的产品线上也有华为手机、华为平板。

如果按照之前的工厂模式来进行设计,那就需要单独设计 9 个工厂来生产上面这些产品,显然这样就比较浪费时间的。

这时可以使用抽象工厂模式,将多个产品都放在一个工厂中进行生成,按不同的产品族进行划分。

比如小米,那么就创建一个小米工厂,这个工厂里面可以生产整条产品线上的内容,包括小米手机、小米平板等。

1、创建产品接口

/**
* 手机
*/
public interface Phone {
/**
* 打电话
*/
void call();
}

/**
* 平板
*/
public interface Pad {
/**
* 看视频
*/
void video();
}

2、定义具体产品

/**
* 小米手机
*/
public class XiaoMiPhone implements Phone {

@Override
public void call() {
System.out.println("小米手机打电话");
}
}

/**
* 小米平板
*/
public class XiaoMiPad implements Pad {
@Override
public void video() {
System.out.println("小米平板看视频");
}
}

/**
* 华为手机
*/
public class HuaWeiPhone implements Phone {
@Override
public void call() {
System.out.println("华为手机打电话");
}
}

/**
* 华为平板
*/
public class HuaWeiPad implements Pad {

@Override
public void video() {
System.out.println("华为平板看视频");
}
}

3、创建抽象工厂

/**
* 抽象工厂
*/
public abstract class AbstractFactory {
/**
* 获取手机
* @return 手机对象
*/
public abstract Phone getPhone();
/**
* 获取平板
* @return 平板对象
*/
public abstract Pad getPad();
}

4、创建品牌工厂

/**
* 小米工厂
*/
public class XiaoMiFactory extends AbstractFactory{
@Override
public Phone getPhone() {
return new XiaoMiPhone();
}
@Override
public Pad getPad() {
return new XiaoMiPad();
}
}

/**
* 华为工厂
*/
public class HuaWeiFactory extends AbstractFactory {
@Override
public Phone getPhone() {
return new HuaWeiPhone();
}
@Override
public Pad getPad() {
return new HuaWeiPad();
}
}

5、生产使用

// 小米手机
Phone xiaomiPhOne= new XiaoMiFactory().getPhone();
// 华为手机
Phone huaweiPhOne= new HuaWeiFactory().getPhone();
// 小米平板
Pad xiaoMiPad = new XiaoMiFactory().getPad();
// 华为平板
Pad huaweiPad = new HuaWeiFactory().getPad();
// 输出测试
xiaomiPhone.call();
huaweiPhone.call();
xiaoMiPad.video();
huaweiPad.video();

输出结果为:

小米手机打电话
华为手机打电话
小米平板看视频
华为平板看视频

如此即实现了各工厂生产不同产品族的产品并实现对应的功能。

一个工厂可以生产同一个产品族的所有产品,这样按族进行分类,显然比之前的工厂模式更好。

不过,缺点还是有的,如果产品族新增了产品,那么我就不得不去为每一个产品族的工厂都去添加新产品的生产方法,违背了开闭原则。

且这种模式需要使用的类原多于工厂模式,除非是类似这种产品族的业务场景,否则还是更推荐工厂模式实现。

本文来自博客园,作者:程序航,转载请注明原文链接:https://www.cnblogs.com/codesail/p/16465481.html



推荐阅读
  • 本文详细记录了在基于Debian的Deepin 20操作系统上安装MySQL 5.7的具体步骤,包括软件包的选择、依赖项的处理及远程访问权限的配置。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • PyCharm下载与安装指南
    本文详细介绍如何从官方渠道下载并安装PyCharm集成开发环境(IDE),涵盖Windows、macOS和Linux系统,同时提供详细的安装步骤及配置建议。 ... [详细]
  • 资源推荐 | TensorFlow官方中文教程助力英语非母语者学习
    来源:机器之心。本文详细介绍了TensorFlow官方提供的中文版教程和指南,帮助开发者更好地理解和应用这一强大的开源机器学习平台。 ... [详细]
  • 探讨如何高效使用FastJSON进行JSON数据解析,特别是从复杂嵌套结构中提取特定字段值的方法。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文介绍了如何在具备多个IP地址的FTP服务器环境中,通过动态地址端口复用和地址转换技术优化网络配置。重点讨论了2Mb/s DDN专线连接、Cisco 2611路由器及内部网络地址规划。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • c# – UWP:BrightnessOverride StartOverride逻辑 ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
author-avatar
蔡晓楠
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有