type
status
date
slug
summary
tags
category
icon
password
工厂方法模式
工厂方法模式是一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型。
![图片来自 refactoringguru.cn](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F87cd7b33-b48f-404a-8322-8403322877a9%2Fb63c7cd2-8287-401d-bea8-37f6736b5747%2FUntitled.png?table=block&id=08abfab2-b253-4920-be52-da48ff66ffe8&t=08abfab2-b253-4920-be52-da48ff66ffe8&width=1280&cache=v2)
工厂方法模式结构
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F87cd7b33-b48f-404a-8322-8403322877a9%2F653d266f-c355-4384-a66b-b51c48450092%2FUntitled.png?table=block&id=f7e8501d-fec9-4ece-a4fd-bbde293c50f6&t=f7e8501d-fec9-4ece-a4fd-bbde293c50f6&width=1974&cache=v2)
- 产品 (Product) 将会对接口进行声明。 对于所有由创建者及其子类构建的对象, 这些接口都是通用的。
- 具体产品 (Concrete Products) 是产品接口的不同实现。
- 创建者 (Creator) 类声明返回产品对象的工厂方法。 该方法的返回对象类型必须与产品接口相匹配。
注意, 尽管它的名字是创建者, 但它最主要的职责并不是创建产品。 一般来说, 创建者类包含一些与产品相关的核心业务逻辑。 工厂方法将这些逻辑处理从具体产品类中分离出来。
- 具体创建者 (Concrete Creators) 将会重写基础工厂方法, 使其返回不同类型的产品。
注意, 并不一定每次调用工厂方法都会创建新的实例。 工厂方法也可以返回缓存、 对象池或其他来源的已有对象。
通用代码结构:
工厂方法适合的应用场景
1.无法预知对象确切类别及其依赖关系时, 可使用工厂方法。
工厂方法将创建产品的代码与实际使用产品的代码分离, 从而能在不影响其他代码的情况下扩展产品创建部分代码。
例如, 如果需要向应用中添加一种新产品, 你只需要开发新的创建者子类, 然后重写其工厂方法即可。
2.如果你希望用户能扩展你软件库或框架的内部组件, 可使用工厂方法。
继承可能是扩展软件库或框架默认行为的最简单方法。 但是当你使用子类替代标准组件时, 框架如何辨识出该子类?
解决方案是将各框架中构造组件的代码集中到单个工厂方法中, 并在继承该组件之外允许任何人对该方法进行重写。
让我们看看具体是如何实现的。 假设你使用开源 UI 框架编写自己的应用。 你希望在应用中使用圆形按钮, 但是原框架仅支持矩形按钮。 你可以使用
圆形按钮
RoundButton子类来继承标准的 按钮
Button类。 但是, 你需要告诉 UI框架
UIFramework类使用新的子类按钮代替默认按钮。为了实现这个功能, 你可以根据基础框架类开发子类 圆形按钮 UI
UIWithRoundButtons , 并且重写其 createButton
创建按钮方法。 基类中的该方法返回 按钮
对象, 而你开发的子类返回 圆形按钮
对象。 现在, 你就可以使用 圆形按钮 UI
类代替 UI框架
类。 就是这么简单!![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F87cd7b33-b48f-404a-8322-8403322877a9%2F32e8044c-1eb4-4f0a-8ee6-f795ba732805%2FUntitled.png?table=block&id=d4824c81-17a0-4cf7-986f-ca182d86a112&t=d4824c81-17a0-4cf7-986f-ca182d86a112&width=1746&cache=v2)
工厂方法模式的优缺点
工厂方法模式的优点:
- 避免创建者与具体的产品逻辑耦合
- 满⾜单⼀职责,每⼀个业务逻辑实现都在所属⾃⼰的类中完成
- 满⾜开闭原则,⽆需更改使⽤调⽤⽅就可以在程序中引⼊新的产品类型
工厂方法模式的缺点:
- 应用工厂方法模式需要引入许多新的子类, 代码可能会因此变得更复杂。 最好的情况是将该模式引入创建者类的现有层次结构中。
抽象工厂模式和声明为abstract
的简单工厂不是同一个,不要弄混了。抽象工厂更多的是产生一系列对象。
练手题目
题目描述
小明家有两个工厂,一个用于生产圆形积木,一个用于生产方形积木,请你帮他设计一个积木工厂系统,记录积木生产的信息。
输入描述
输入的第一行是一个整数 N(1 ≤ N ≤ 100),表示生产的次数。接下来的 N 行,每行输入一个字符串和一个整数,字符串表示积木的类型。积木类型分为 "Circle" 和 "Square" 两种。整数表示该积木生产的数量
输出描述
对于每个积木,输出一行字符串表示该积木的信息。
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F87cd7b33-b48f-404a-8322-8403322877a9%2F39ff6c45-efad-4687-ae03-4c0ed71f54db%2FUntitled.png?table=block&id=61dea7f5-dc46-4026-a035-618b39a043fc&t=61dea7f5-dc46-4026-a035-618b39a043fc&width=704&cache=v2)
提示信息
在示例中,积木工厂生产了3块积木,其中有2块是圆形积木,1块是方形积木。根据输入的类型,每块积木的信息被输出到控制台。
解题:
1、简单工厂模式代码实现:
2.利用反射实现工厂方法
欢迎您在底部评论区留言,一起交流~
- 作者:Nolan
- 链接:https://nolanblog.top/article/DP2
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。