完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
抽象工厂模式(Abstract Factory Pattern)提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。
抽象工厂模式 问题引入 |
|
相关推荐
1个回答
|
|
假设你正在开发一款家具商店模拟器。 你的代码中包括一些类, 用于表示:
你需要设法单独生成每件家具对象, 这样才能确保其风格一致。 如果顾客收到的家具风格不一样, 他们可不会开心。 此外, 你也不希望在添加新产品或新风格时修改已有代码。 家具供应商对于产品目录的更新非常频繁, 你不会想在每次更新时都去修改核心代码的。 抽象工厂模式 解决方案 首先, 抽象工厂模式建议为系列中的每件产品明确声明接口 (例如椅子、 沙发或咖啡桌)。 然后, 确保所有产品变体都继承这些接口。 例如, 所有风格的椅子都实现 Chair 接口; 所有风格的咖啡桌都实现 CoffeeTable 接口, 以此类推。 接下来, 我们需要声明抽象工厂——包含系列中所有产品构造方法的接口。 例如 createChair创建椅子 、 createSofa创建沙发和 createCoffeeTable创建咖啡桌 。 这些方法必须返回抽象产品类型, 即我们之前抽取的那些接口: 椅子 , 沙发和 咖啡桌等等。 那么该如何处理产品变体呢? 对于系列产品的每个变体, 我们都将基于 抽象工厂接口创建不同的工厂类。 每个工厂类都只能返回特定类别的产品, 例如, 现代家具工厂ModernFurnitureFactory只能创建 现代椅子MordernChair 、 现代沙发ModernSofa和 现代咖啡桌ModernCoffeeTable对象。 客户端代码可以通过相应的抽象接口调用工厂和产品类。 你无需修改实际客户端代码, 就能更改传递给客户端的工厂类, 也能更改客户端代码接收的产品变体。 假设客户端想要工厂创建一把椅子。 客户端无需了解工厂类, 也不用管工厂类创建出的椅子类型。 无论是现代风格, 还是维多利亚风格的椅子, 对于客户端来说没有分别, 它只需调用抽象 椅子接口就可以了。 这样一来, 客户端只需知道椅子以某种方式实现了 sitOn坐下方法就足够了。 此外, 无论工厂返回的是何种椅子变体, 它都会和由同一工厂对象创建的沙发或咖啡桌风格一致。 最后一点说明: 如果客户端仅接触抽象接口, 那么谁来创建实际的工厂对象呢? 一般情况下, 应用程序会在初始化阶段创建具体工厂对象。 而在此之前, 应用程序必须根据配置文件或环境设定选择工厂类别。 抽象工厂模式 结构
下面例子通过应用抽象工厂模式, 使得客户端代码无需与具体 UI 类耦合, 就能创建跨平台的 UI 元素, 同时确保所创建的元素与指定的操作系统匹配。 跨平台应用中的相同 UI 元素功能类似, 但是在不同操作系统下的外观有一定差异。 此外, 你需要确保 UI 元素与当前操作系统风格一致。 你一定不希望在 Windows 系统下运行的应用程序中显示 macOS 的控件。 抽象工厂接口声明一系列构建方法, 客户端代码可调用它们生成不同风格的 UI 元素。 每个具体工厂对应特定操作系统, 并负责生成符合该操作系统风格的 UI 元素。 其运作方式如下: 应用程序启动后检测当前操作系统。 根据该信息, 应用程序通过与该操作系统对应的类创建工厂对象。 其余代码使用该工厂对象创建 UI 元素。 这样可以避免生成错误类型的元素。 使用这种方法, 客户端代码只需调用抽象接口, 而无需了解具体工厂类和 UI 元素。 此外, 客户端代码还支持未来添加新的工厂或 UI 元素。 这样一来, 每次在应用程序中添加新的 UI 元素变体时, 你都无需修改客户端代码。 你只需创建一个能够生成这些 UI 元素的工厂类, 然后稍微修改应用程序的初始代码, 使其能够选择合适的工厂类即可。 1 // 抽象工厂接口声明了一组能返回不同抽象产品的方法。这些产品属于同一个系列 2 // 且在高层主题或概念上具有相关性。同系列的产品通常能相互搭配使用。系列产 3 // 品可有多个变体,但不同变体的产品不能搭配使用。 4 interface GUIFactory is 5 method createButton():Button 6 method createCheckbox():Checkbox 7 8 9 // 具体工厂可生成属于同一变体的系列产品。工厂会确保其创建的产品能相互搭配10 // 使用。具体工厂方法签名会返回一个抽象产品,但在方法内部则会对具体产品进11 // 行实例化。12 class WinFactory implements GUIFactory is13 method createButton():Button is14 return new WinButton()15 method createCheckbox():Checkbox is16 return new WinCheckbox()17 18 // 每个具体工厂中都会包含一个相应的产品变体。19 class MacFactory implements GUIFactory is20 method createButton():Button is21 return new MacButton()22 method createCheckbox():Checkbox is23 return new MacCheckbox()24 25 26 // 系列产品中的特定产品必须有一个基础接口。所有产品变体都必须实现这个接口。27 interface Button is28 method paint()29 30 // 具体产品由相应的具体工厂创建。31 class WinButton implements Button is32 method paint() is33 // 根据 Windows 样式渲染按钮。34 35 class MacButton implements Button is36 method paint() is37 // 根据 macOS 样式渲染按钮38 39 // 这是另一个产品的基础接口。所有产品都可以互动,但是只有相同具体变体的产40 // 品之间才能够正确地进行交互。41 interface Checkbox is42 method paint()43 44 class WinCheckbox implements Checkbox is45 method paint() is46 // 根据 macOS 样式渲染复选框。47 48 class MacCheckbox implements Checkbox is49 method paint() is50 // 根据 macOS 样式渲染复选框。51 52 // 客户端代码仅通过抽象类型(GUIFactory、Button 和 Checkbox)使用工厂53 // 和产品。这让你无需修改任何工厂或产品子类就能将其传递给客户端代码。54 class Application is55 private field factory: GUIFactory56 private field button: Button57 constructor Application(factory: GUIFactory) is58 this.factory = factory59 method createUI() is60 this.button = factory.createButton()61 method paint() is62 button.paint()63 64 65 // 程序会根据当前配置或环境设定选择工厂类型,并在运行时创建工厂(通常在初66 // 始化阶段)。67 class ApplicationConfigurator is68 method main() is69 config = readApplicationConfigFile()70 71 if (config.OS == "Windows") then72 factory = new WinFactory()73 else if (config.OS == "Mac") then74 factory = new MacFactory()75 else76 throw new Exception("错误!未知的操作系统。")77 78 Application app = new Application(factory) 抽象工厂模式 适用性
抽象工厂模式优点
转载 https://geek-docs.com/design-pattern/abstract-factory/abstract-factory-pattern.html |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
“0元购”智元灵犀X1机器人,软硬件全套图纸和代码全公开!资料免费下载!
2642 浏览 2 评论
1365 浏览 0 评论
【实操文档】在智能硬件的大模型语音交互流程中接入RAG知识库
6550 浏览 1 评论
防止AI大模型被黑客病毒入侵控制(原创)聆思大模型AI开发套件评测4
1075 浏览 0 评论
不可错过!人工神经网络算法、PID算法、Python人工智能学习等资料包分享(附源代码)
3394 浏览 0 评论
浏览过的版块 |
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-18 09:48 , Processed in 0.599925 second(s), Total 71, Slave 54 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号