设计模式--创建模式--抽象工厂模式

本文介绍了抽象工厂模式的应用场景和优势,如系统独立性、产品族一致性等,同时也指出了其局限性,例如难以支持新产品类型。通过对比工厂方法模式,阐述了两种模式的区别及适用场景。

intent

•Provide an interface for creating families of related ordependent objects without specifying their concrete classes.
•提供一个接口使得不使用具体的类来创建有关系的或者依赖关系的对象族。

 

UML

Applicability

•a system should be independent of how its products arecreated, composed, and represented.
•一个系统要独立于产品的创建、组合、表示。
•a system should be configured with one of multiplefamilies of products.
•一个系统需要由多个产品族中的一个来配置。
•a family of related product objects is designed to beused together, and this constraint youneed to enforce 。
•产品族被用来一起联合使用并强制一些约束。
•you want to provide a class library of products, and youwant to reveal just their interfaces, not their implementations.
•你需要提供一些产品类库,并且你仅仅使用他的接口。而不去实现他们。
 

Consequences

•It isolates concrete classes.
•分离了具体的类。
•It makes exchanging product families easy.
•使产品族更容易改变。
•It promotes consistency among products.
•有利于产品族的一致性
•Supporting new kinds of products is difficult.
•支持新种类产品比较困难。
 

产品等级结构

多个产品等级结构

产品族

具体的UML

 

TankGameUML

•在TankGame中元素分为矢量图版和图片版。所以对于产品角色来讲有两套产品族。两个工厂。

 

工厂方法UML与抽象工厂比对

工厂方法着重于Creator中的FactoryMethod()

抽象工厂着重于AbstractFactory

1、当增加产品等级结构

此时便不满足开闭原则。

2、当增加产品族

增加产品族,则满足开闭原则。

### 抽象工厂模式概述 抽象工厂模式是一种创建设计模式,其核心在于提供了一种方式来创建一系列相关或相互依赖的对象,而不必指定它们的具体类[^2]。通过这种方式,客户端能够使用统一的接口来获取所需的产品实例,从而降低了系统组件之间的耦合度。 #### 模式的结构与工作原理 该模式主要由四个部分组成: - **抽象工厂(Abstract Factory)**:定义了一个用于创建一族具体产品对象的方法集合。 - **具体工厂(Concrete Factory)**:实现了抽象工厂所声明的操作,负责生产特定种类的产品系列。 - **抽象产品(Abstract Product)**:为每一种可能被生产的物品设定了通用接口。 - **具体产品(Concrete Product)**:实际要创建出来的实体类,继承自相应的抽象产品并实现其功能。 当客户请求某个类型的对象时,会调用相应工厂里的方法得到想要的结果;由于整个过程中只涉及到高层模块对于低层模块的引用(即仅知道如何操作抽象级别的成员),因此即使内部逻辑发生变化也不会影响到外部使用者。 #### 应用场景分析 此模式非常适合应用于以下情况: - 当应用程序存在多个可互换的产品线,并希望保持独立性以便于扩展新特性时不破坏现有代码; - 需要在运行期间动态决定应该采用哪一套设计方案来进行构建; - 要求确保同一版本下的各个组成部分始终一致地协同运作。 例如,在图形库中可以根据不同的渲染引擎选择合适的形状绘制器(如OpenGL vs DirectX)。再比如操作系统风格切换工具里根据不同主题调整窗口控件外观等都是很好的例子。 #### Java实现案例展示 下面给出一段简单的Java代码片段用来说明上述概念的应用: ```java // 定义两个层次的产品接口 public interface GUIFactory { Button createButton(); } public interface Button { void paint(); } ``` 接着分别针对Windows和MacOS平台定制化各自的GUI元素: ```java // Windows风格按钮 class WinButton implements Button { public void paint() { System.out.println("Render a button in the Windows style."); } } // MacOS风格按钮 class MacButton implements Button { public void paint() { System.out.println("Render a button in the macOS style."); } } ``` 最后建立对应的工厂类完成最终组装: ```java // 创建适用于Windows系统的UI部件制造者 class WinFactory implements GUIFactory { @Override public Button createButton() { return new WinButton(); } } // 创建适用于macOS系统的UI部件制造者 class MacFactory implements GUIFactory { @Override public Button createButton() { return new MacButton(); } } ``` 这样就可以很容易地根据当前环境配置选取适当的主题样式了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值