type
status
date
slug
summary
tags
category
icon
password

工厂方法模式

 
工厂方法模式是一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型。
                        图片来自 refactoringguru.cn
图片来自 refactoringguru.cn
 

工厂方法模式结构

 
notion image
 
  1. 产品 (Product) 将会对接口进行声明。 对于所有由创建者及其子类构建的对象, 这些接口都是通用的。
  1. 具体产品 (Concrete Products) 是产品接口的不同实现。
  1. 创建者 (Creator) 类声明返回产品对象的工厂方法。 该方法的返回对象类型必须与产品接口相匹配。
    1. 注意, 尽管它的名字是创建者, 但它最主要的职责并不是创建产品。 一般来说, 创建者类包含一些与产品相关的核心业务逻辑。 工厂方法将这些逻辑处理从具体产品类中分离出来。
  1. 具体创建者 (Concrete Creators) 将会重写基础工厂方法, 使其返回不同类型的产品。
    1. 注意, 并不一定每次调用工厂方法都会创建新的实例。 工厂方法也可以返回缓存、 对象池或其他来源的已有对象。
 
通用代码结构:
 

工厂方法适合的应用场景

1.无法预知对象确切类别及其依赖关系时, 可使用工厂方法。
工厂方法将创建产品的代码与实际使用产品的代码分离, 从而能在不影响其他代码的情况下扩展产品创建部分代码。
例如, 如果需要向应用中添加一种新产品, 你只需要开发新的创建者子类, 然后重写其工厂方法即可。
 
2.如果你希望用户能扩展你软件库或框架的内部组件, 可使用工厂方法。
继承可能是扩展软件库或框架默认行为的最简单方法。 但是当你使用子类替代标准组件时, 框架如何辨识出该子类?
解决方案是将各框架中构造组件的代码集中到单个工厂方法中, 并在继承该组件之外允许任何人对该方法进行重写。
让我们看看具体是如何实现的。 假设你使用开源 UI 框架编写自己的应用。 你希望在应用中使用圆形按钮, 但是原框架仅支持矩形按钮。 你可以使用 圆形按钮Round­Button子类来继承标准的 按钮Button类。 但是, 你需要告诉 UI框架UIFramework类使用新的子类按钮代替默认按钮。为了实现这个功能, 你可以根据基础框架类开发子类 圆形按钮 UIUIWith­Round­Buttons , 并且重写其 create­Button创建按钮方法。 基类中的该方法返回 按钮对象, 而你开发的子类返回 圆形按钮对象。 现在, 你就可以使用 圆形按钮 UI类代替 UI框架类。 就是这么简单!
 
notion image
 

工厂方法模式的优缺点

工厂方法模式的优点:
  • 避免创建者与具体的产品逻辑耦合
  • 满⾜单⼀职责,每⼀个业务逻辑实现都在所属⾃⼰的类中完成
  • 满⾜开闭原则,⽆需更改使⽤调⽤⽅就可以在程序中引⼊新的产品类型
工厂方法模式的缺点:
  • 应用工厂方法模式需要引入许多新的子类, 代码可能会因此变得更复杂。 最好的情况是将该模式引入创建者类的现有层次结构中。
 
抽象工厂模式和声明为 abstract的简单工厂不是同一个,不要弄混了。抽象工厂更多的是产生一系列对象。
 

练手题目

 

题目描述

小明家有两个工厂,一个用于生产圆形积木,一个用于生产方形积木,请你帮他设计一个积木工厂系统,记录积木生产的信息。
 

输入描述

输入的第一行是一个整数 N(1 ≤ N ≤ 100),表示生产的次数。接下来的 N 行,每行输入一个字符串和一个整数,字符串表示积木的类型。积木类型分为 "Circle" 和 "Square" 两种。整数表示该积木生产的数量
 

输出描述

对于每个积木,输出一行字符串表示该积木的信息。
 
notion image
 

提示信息

在示例中,积木工厂生产了3块积木,其中有2块是圆形积木,1块是方形积木。根据输入的类型,每块积木的信息被输出到控制台。
 

解题:

1、简单工厂模式代码实现:
 
2.利用反射实现工厂方法
 
 
💡
欢迎您在底部评论区留言,一起交流~
抽象工厂模式单例模式
  • Twikoo
  • Giscus
  • Cusdis
Nolan
Nolan
靠天吃饭自由人🍚
公告
🎉欢迎来到阿豪的小站🎉
😊大家好,我是阿豪
🌱热爱看书、冥想、听播客、徒步
👯喜欢交朋友,很高兴能认识你!
免责声明
⚠️本站所有内容仅代表作者个人观点。内容仅供学习和交流使用,可以转载,但请注明出处。
⚠️用户使用信息时请自行核实,本站不对信息的准确性、完整性或使用后果承担责任。遵守相关法律法规,不得用于非法目的。
 
2023-2024 Nolan.

NotionNext BLOG | 靠天吃饭自由人🍚

Powered by Nolan.