热门标签 | 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



推荐阅读
  • 本文介绍了多种Eclipse插件,包括XML Schema Infoset Model (XSD)、Graphical Editing Framework (GEF)、Eclipse Modeling Framework (EMF)等,涵盖了从Web开发到图形界面编辑的多个方面。 ... [详细]
  • Nagios可视化插件开发指南 —— 配置详解
    本文详细介绍了Nagios监控系统的配置过程,包括数据库的选择与安装、Nagios插件的安装及配置文件的解析。同时,针对常见的配置错误提供了具体的解决方法。 ... [详细]
  • 本文详细介绍了Java Web项目的开发流程,从环境搭建到项目部署,为初学者和开发者提供了一套完整的指南。 ... [详细]
  • 系统:MacOS10.15.2,XCode11.3,swift5.0写作时间:2020-01-09说明Swift中的闭包(Closur ... [详细]
  • 深入理解Java反射机制
    本文将详细介绍Java反射的基础知识,包括如何获取Class对象、反射的基本过程、构造器、字段和方法的反射操作,以及内省机制的应用。同时,通过实例代码加深对反射的理解,并探讨其在实际开发中的应用。 ... [详细]
  • 面对快应用开发时需要获取摘要值的需求,但官方API并未直接提供相应支持。通过探索发现,利用第三方加密库crypto-js可有效解决此问题。本文将详细介绍如何集成并使用该库来实现摘要值的获取。 ... [详细]
  • 构建高性能Feed流系统的设计指南
    随着移动互联网的发展,Feed流系统成为了众多社交应用的核心组成部分。本文将深入探讨如何设计一个高效、稳定的Feed流系统,涵盖从基础架构到高级特性的各个方面。 ... [详细]
  • 本文介绍了在解决Hive表中复杂数据结构平铺化问题后,如何通过创建视图来准确计算广告日志的曝光PV,特别是针对用户对应多个标签的情况。同时,详细探讨了UDF的使用方法及其在实际项目中的应用。 ... [详细]
  • 基于OpenCV的小型图像检索系统开发指南
    本文详细介绍了如何利用OpenCV构建一个高效的小型图像检索系统,涵盖从图像特征提取、视觉词汇表构建到图像数据库创建及在线检索的全过程。 ... [详细]
  • HDU1085 捕获本·拉登!
    问题描述众所周知,本·拉登是一位臭名昭著的恐怖分子,他已失踪多年。但最近有报道称,他藏匿在中国杭州!虽然他躲在杭州的一个洞穴中不敢外出,但近年来他因无聊而沉迷于数学问题,并声称如果有人能解出他的题目,他就自首。 ... [详细]
  • 利用50行Python代码打造经典游戏,既是休闲娱乐,也是编程学习的利器
    Free Python Games 是一个适合学生和初学者的项目,它不仅提供了高度的组织性和灵活性,还极大地激发了用户的探索与理解能力。 ... [详细]
  • 探讨了生成时间敏感的一次性伪随机密码的方法,旨在通过加入时间因素防止重放攻击。 ... [详细]
  • 解决jQuery Spinner按钮垂直排列问题
    本文探讨了如何通过CSS调整jQuery Spinner组件中的上下按钮,实现它们的垂直堆叠布局。 ... [详细]
  • 解决IntelliJ IDEA启动Tomcat时无法定位Chrome浏览器问题
    本文介绍了一种有效的方法来解决在使用IntelliJ IDEA启动Tomcat时遇到的Chrome浏览器路径未被正确识别的问题,通过简单的步骤即可轻松解决。 ... [详细]
  • BL550721、特点液晶驱动输出:Common输出4线,Segment输出36线内置显示寄存器364144bit2线串行接口(SCL,SDA)内置震荡电路内置液晶驱动电源电路13 ... [详细]
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社区 版权所有