当前位置:网站首页>工厂方法模式、抽象工厂模式
工厂方法模式、抽象工厂模式
2022-06-26 05:36:00 【绿毛水怪12138】
什么是工厂模式
工厂模式在其父类提供一个创建对象的方法,让其子类去实现具体返回那个对象
UML图
工厂方法模式
抽象工厂模式
两者的对比
从上述的UML图中我们可以看出,工厂方法模式只定义了一种产品继承关系,而抽象工厂可以定义多种产品继承关系。可以很优美的完成工厂的扩建,而产品的扩建则不满足开闭原则。工厂方法模式可以很好的满足工厂和商品的扩建,但在工厂和商品很多的情况下,未免显得很庞杂。
以下内容来自此网站
工厂模式使用场景
- 当你在编写代码的过程中, 如果无法预知对象确切类别及其依赖关系时, 可使用工厂方法。
- 工厂方法将创建产品的代码与实际使用产品的代码分离, 从而能在不影响其他代码的情况下扩展产品创建部分代码。例如, 如果需要向应用中添加一种新产品, 你只需要开发新的创建者子类, 然后重写其工厂方法即可。
- 如果你希望用户能扩展你软件库或框架的内部组件, 可使用工厂方法。
- 继承可能是扩展软件库或框架默认行为的最简单方法。 但是当你使用子类 替代标准组件时, 框架如何辨识出该子类?
- 解决方案是将各框架中构造组件的代码集中到单个工厂方法中, 并在继承该组件之外允许任何人对该方法进行重写。
- 让我们看看具体是如何实现的。 假设你使用开源 UI 框架编写自己的应用。 你希望在应用中使用圆形按钮, 但是原框架仅支持矩形按钮。 你可以使用 圆形按钮RoundButton子类来继承标准的 按钮Button类。 但是, 你需要告诉 UI框架UIFramework类使用新的子类按钮代替默认按钮。
- 为了实现这个功能, 你可以根据基础框架类开发子类 圆形按钮 UIUIWithRoundButtons , 并且重写其 createButton创建按钮方法。 基类中的该方法返回 按钮对象, 而你开发的子类返回 圆形按钮对象。 现在, 你就可以使用 圆形按钮 UI类代替 UI框架类。 就是这么简单!

- 如果你希望复用现有对象来节省系统资源, 而不是每次都重新创建对象, 可使用工厂方法。
在处理大型资源密集型对象 (比如数据库连接、 文件系统和网络资源) 时, 你会经常碰到这种资源需求。
让我们思考复用现有对象的方法:
首先, 你需要创建存储空间来存放所有已经创建的对象。
当他人请求一个对象时, 程序将在对象池中搜索可用对象。
… 然后将其返回给客户端代码。
如果没有可用对象, 程序则创建一个新对象 (并将其添加到对象池中)。这些代码可不少! 而且它们必须位于同一处, 这样才能确保重复代码不会污染程序。可能最显而易见, 也是最方便的方式, 就是将这些代码放置在我们试图重用的对象类的构造函数中。 但是从定义上来讲, 构造函数始终返回的是新对象, 其无法返回现有实例。
因此, 你需要有一个既能够创建新对象, 又可以重用现有对象的普通方法。 这听上去和工厂方法非常相像。
- 如果代码需要与多个不同系列的相关产品交互, 但是由于无法提前获取相关信息, 或者出于对未来扩展性的考虑, 你不希望代码基于产品的具体类进行构建, 在这种情况下, 你可以使用抽象工厂。
- 抽象工厂为你提供了一个接口, 可用于创建每个系列产品的对象。 只要代码通过该接口创建对象, 那么你就不会生成与应用程序已生成的产品类型不一致的产品。
与其他设计模式的关系
边栏推荐
- PHP 2D / multidimensional arrays are sorted in ascending and descending order according to the specified key values
- How to ensure the efficiency and real-time of pushing large-scale group messages in mobile IM?
- Replacing domestic image sources in openwrt for soft routing (take Alibaba cloud as an example)
- 劣币驱逐良币的思考
- cartographer_ backend_ constraint
- REUSE_ALV_GRID_DISPLAY 事件实现(DATA_CHANGED)
- 【ARM】在NUC977上搭建基于boa的嵌入式web服务器
- Daily production training report (17)
- ZigBee learning in simple terms Lecture 1
- Red team scoring method statistics
猜你喜欢

Could not get unknown property ‘*‘ for SigningConfig container of type org. gradle. api. internal

Official image acceleration

Replacing domestic image sources in openwrt for soft routing (take Alibaba cloud as an example)

Introduction to alluxio

cartographer_backend_constraint
![[activity recommendation] cloud native, industrial Internet, low code, Web3, metauniverse... Which is the architecture hot spot in 2022](/img/64/5b2aec7a26c64c104c86e200f83b2d.png)
[activity recommendation] cloud native, industrial Internet, low code, Web3, metauniverse... Which is the architecture hot spot in 2022

Red team scoring method statistics

There are applications related to web network request API in MATLAB (under update)

uni-app吸顶固定样式

Redis discovery bloom filter
随机推荐
Learn cache lines and pseudo sharing of JVM slowly
Two step processing of string regular matching to get JSON list
ZigBee learning in simple terms lesson 3 external interruption
PHP 2D / multidimensional arrays are sorted in ascending and descending order according to the specified key values
REUSE_ALV_GRID_DISPLAY 事件实现(DATA_CHANGED)
11 IO frame
[upsampling method opencv interpolation]
Yunqi lab recommends experience scenarios this week, free cloud learning
FindControl的源代码
2021年OWASP-TOP10
【MYSQL】MySQL 百万级数据量分页查询方法及其优化
Posting - don't get lost in the ocean of Technology
cartographer_fast_correlative_scan_matcher_2d分支定界粗匹配
[arm] build boa based embedded web server on nuc977
Redis discovery bloom filter
【ARM】在NUC977上搭建基于boa的嵌入式web服务器
Cyclic displacement
How to ensure the efficiency and real-time of pushing large-scale group messages in mobile IM?
Gd32f3x0 official PWM drive has a small positive bandwidth (inaccurate timing)
Consul服务注册与发现