抽象工厂模式

 在开发一款游戏时,我们需要开发按钮Button及展板Board等组件,我们有多种风格Ligth或Dark,不同风格下组件的颜色、形状也不相同。如果按照工厂方法模式,则设计如下:

图 工厂方法模式实现上述需求

以上方法存在两个问题: 1) Factory的数量过多,系统变得更加臃肿;2)不能保证同风格下,生成一致的组件。比如在开发中,可能会出现LightButton + DarkBoard的组合。

1 抽象工厂

1.1 产品族与产品等级结构

图 apple产品系列

在每年apple公司都几乎会推出系列产品,比如2022年推出的iPhone 14与iPad 十代,这属于一个产品族。而 2010年推出 iphone 4 及 2022年推出iPhone 14,这属于一个产品等级结构。

1.2 抽象工厂模式概述

为创建一组对象提供了一组解决方案。与工厂方法模式相比,抽象工厂模式中的具体工厂不只是创建一种产品,而是创建一族产品。

图 抽象工厂模式

AbstractProductA、AbstractProductB: 产品族的产品抽象。

ProductA1、ProductA2等:产品族中具体的产品。

Factory:抽象工厂,声名了一组用于创建一族产品的方法,每个方法对应一种产品。

ConcreteFactory1:具体工厂,实现了创建产品族的方法,用于创建某一等级的产品族。

public interface Board {
}public class DarkBoard implements Board{
}public class LightBoard implements Board{
}public interface Button {
}public class DarkButton implements Button{
}public class LightButton implements Button{
}public interface AbstractFactory {Button createButton();Board createBoard();}public class DarkFactory implements AbstractFactory{@Overridepublic Button createButton() {return new DarkButton();}@Overridepublic Board createBoard() {return new DarkBoard();}
}public class LightFactory implements AbstractFactory {@Overridepublic Button createButton() {return new LightButton();}@Overridepublic Board createBoard() {return new LightBoard();}}/*** 在开发一款游戏时,我们需要开发按钮Button及展板Board等组件,* 我们有多种风格Ligth或Dark,不同风格下组件的颜色、形状也不相同。*/
public class Client {public static void main(String[] args) {AbstractFactory factory = null;factory = new DarkFactory();Board board = factory.createBoard();Button button = factory.createButton();System.out.println(button);System.out.println(board);}}

2 优缺点

优点:

1)隔离了类的实例化过程,使得客户并不需要知道怎么创建。

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

3)增加新的产品族方便,符合开闭原则。

缺点:

1)往产品族中添加新的产品麻烦,需要对原有系统进行大量修改,违背了开闭原则。

3 适用场景

  1. 系统中有多于一个的产品族需要创建且产品族群稳定,不会向族群再添加新的产品;
  2. 需保证统一产品族的产品有共同约束时。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/28107.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自动化测试工具比传统测试工具的优势体现在哪里?

随着软件行业的快速发展和扩张,自动化测试工具在提高测试效率和质量方面起到了不可或缺的作用,那你知道自动化测试工具比传统测试工具的优势体现在哪里吗? 首先,自动化测试工具能够大大缩短测试周期。相比于传统手动测试&#xff…

学习系统编程No.31【多线程互斥与同步】

引言: 北京时间:2023/7/16/14:32,摆烂至今,在耍这方面,谁能比我行,哈哈哈,乐观!欠了一堆课要补,等我们把线程相关知识学完,对于系统编程方面我们搞定的就差不…

go语言终端交叉编译的事项windows编译其它平台软件包

交叉编译的终极版本[以此为准]: windows编译窗口目前分为cmd窗口,powershell窗口,这两个里面运行的命令不一样。 1.cmd窗口编译; 在windows10之前的系统版本上使用cmd命令行可以使用命令 CMD命令行中 在CMD命令行中编译&#…

【Unity 实用插件篇】| ReferenceFinder 引用查找插件,提高引擎查找使用效率

前言 【Unity 实用插件篇】| ReferenceFinder 引用查找插件,提高引擎查找使用效率一、ReferenceFinder 介绍二、使用示例三、实现方案3.1 方案选择3.2 查找及缓存3.3 界面实现 总结 前言 ReferenceFinder 是一个比较小众的插件,主要用来查找资源引用和…

Premiere Pro 2023(23.5) Mac

Premiere Pro是一个业界领先的视频编辑软件,旨在帮助用户快速、高效地制作和编辑专业质量的视频内容。作为Creative Cloud套装中的一部分,Premiere Pro具有丰富的功能和工具,可应对各种视频编辑需求。 Premiere Pro的主要特点包括多个视频和音…

竹云IDaaS | 全面融合AWS Cognito

AWS Cognito组件用户池User Pool国内暂未上线,身份云IDaaS可完全替代Cognito用户池,借助身份云进行用户身份验证并融合Coginto身份池Identity Pool,实现对AWS资源的无缝安全访问。 企业面临的挑战 AWS Cognito中国站暂未提供用户池User&…

OpenCV for Python 学习第五天:图片属性的获取

上一篇博文当中,我们学习了如何获取图片的通道,我们了解了通道的分离方法split()和通道的组合方法merge()。那么我们今天就来对图片的属性做一个深入的了解。 文章目录 图片属性OpenCV中属性介绍图片属性的获取 图片属性 图片属性是指描述和定义一张图片…

数字IC后端设计实现中的Post-mask ECO应该怎么做?

在数字IC后端设计实现中,我们经常会涉及到芯片需要做Function ECO。常见的Function ECO可以分为pre mask ECO和post mask ECO两种。因此,作为一个数字IC后端工程师,必须熟练掌握这两种Function ECO的实现流程及其实现技巧。 两者的区别在于&…

SQL-每日一题【585.2016年的投资】

题目 Insurance 表: 请你编写一个 SQL 查询,报告 2016 年 (tiv_2016) 所有满足下述条件的投保人的投保金额之和: 他在 2015 年的投保额 (tiv_2015) 至少跟一个其他投保人在 2015 年的投保额相同。他所在的城市必须与其他投保人都不同&#…

【Spring——Spring的基础与创建】

目录 🍧1. 什么是 Spring ? 🫖1.1 容器 🍙1.2 IoC 🥽1.3 汽车类——传统写法 🍘1.4 汽车类——IoC 写法 🌭2. 配置 maven 国内源 🌮2.1 在设置中勾选文件 🍤2.2 在…

自动化测试selenium(1)

自动化测试📪selenium 自动化测试📪selenium自动化测试📑selenium定位元素📍 实战测试百度搜索🔍安装测试环境Idea中进行自动化脚本编写打开网页:实现搜索功能:浏览器清空效果clear()&#xff1…

使用typora+PicGo+Gitee简单实现图片上传功能

本文通过配置PicGoGitee来实现typora图片上传功能,系统是window 注意下载的清单有:PicGo,node.js,配置有:PicGo,node.js,gitee,typora 看着复杂实际上并不难,只是繁琐&am…