type
status
date
slug
summary
tags
category
icon
password
抽象工厂模式
抽象工厂模式是一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类。
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F87cd7b33-b48f-404a-8322-8403322877a9%2Fa9fdaa28-b5d3-4e50-a0d6-770275c79194%2Fabstract-factory-zh-2x.png?table=block&id=873eec92-6f82-4f22-8bc3-e93fdb1da6cf&t=873eec92-6f82-4f22-8bc3-e93fdb1da6cf&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%2F29d8cc45-ca32-4708-8aa4-893f0d276b65%2FUntitled.png?table=block&id=d350e072-ca5b-4f90-9bed-3175792c29ab&t=d350e072-ca5b-4f90-9bed-3175792c29ab&width=1400&cache=v2)
- 抽象产品(Abstract Product)为构成系列产品的一组不同但相关的产品声明接口。
- 具体产品(Concrete Product)是抽象产品的多种不同类型实现。所有变体都必须实现相应的抽象产品。
- 抽象工厂(Abstract Factory)接口声明了一组创建各种抽象产品的方法。
- 具体工厂 (Concrete Factory)实现抽象工厂的构建方法。每个具体工厂都对应特定产品变体,且仅创建此种产品变体。
- 尽管具体工厂会对具体产品进行初始化,其构建方法签名必须返回相应的抽象产品。这样,使用工厂类的客户端代码就不会与工厂创建的特定产品变体耦合。客户端 (Client)只需通过抽象接口调用工厂和产品对象,就能与任何具体工厂/产品变体交互。
抽象工厂模式通用代码
抽象工厂模式适合应用场景
- 如果代码需要与多个不同系列的相关产品交互,但是由于无法提前获取相关信息,或者出于对未来扩展性的考虑,你不希望代码基于产品的具体类进行构建,在这种情况下,你可以使用抽象工厂。
- 如果你有一个基于一组抽象方法的类, 且其主要功能因此变得不明确, 那么在这种情况下可以考虑使用抽象工厂模式。
- 在设计良好的程序中, 每个类仅负责一件事。 如果一个类与多种类型产品交互, 就可以考虑将工厂方法抽取到独立的工厂类或具备完整功能的抽象工厂类中。
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F87cd7b33-b48f-404a-8322-8403322877a9%2F4dde4056-5ba2-456d-9d63-8f89485803a7%2FUntitled.png?table=block&id=1a772cfb-17bb-43cd-bade-bfdae0550f5d&t=1a772cfb-17bb-43cd-bade-bfdae0550f5d&width=1712&cache=v2)
识别方法: 我们可以通过方法来识别该模式——其会返回一个工厂对象。 接下来, 工厂将被用于创建特定的子组件。
抽象工厂模式优缺点
抽象工厂模式优点:
- 你可以确保同一工厂生成的产品相互匹配。
- 你可以避免客户端和具体产品代码的耦合。
- 单一职责原则。 你可以将产品生成代码抽取到同一位置, 使得代码易于维护。
- 开闭原则。 向应用程序中引入新产品变体时, 你无需修改客户端代码。
抽象工厂模式的缺点:
• 由于采用该模式需要向应用中引入众多接口和类, 代码可能会比之前更加复杂。
练手题目
题目描述
小明家新开了两个工厂用来生产家具,一个生产现代风格的沙发和椅子,一个生产古典风格的沙发和椅子,现在工厂收到了一笔订单,请你帮他设计一个系统,描述订单需要生产家具的信息。
输入描述
输入的第一行是一个整数 N(1 ≤ N ≤ 100),表示订单的数量。接下来的 N 行,每行输入一个字符串,字符串表示家具的类型。家具类型分为 "modern" 和 "classical" 两种。
输出描述
对于每个积木,输出一行字符串表示该积木的信息。对于每笔订单,输出字符串表示该订单需要生产家具的信息。modern订单会输出下面两行字符串modern chairmodern sofaclassical订单会输出下面两行字符串classical chairclassical soft
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F87cd7b33-b48f-404a-8322-8403322877a9%2Fe1c1923f-954e-4cf0-9adc-b117e38ab6ce%2FUntitled.png?table=block&id=7146e680-5323-4e38-886f-2d4ed60af0fe&t=7146e680-5323-4e38-886f-2d4ed60af0fe&width=773&cache=v2)
提示信息
在示例中,工厂收到了3笔订单,其中有2笔要求生产modern风格,1笔要求生产classical风格。根据输入的类型,每次订单生产的家具信息被输出到控制台上。
题解
示例代码:
欢迎您在底部评论区留言,一起交流~
- 作者:Nolan
- 链接:https://nolanblog.top/article/DP3
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。