工厂方法模式

简介: 工厂方法模式是一种创建型设计模式,通过定义创建对象的接口,由子类决定实例化哪个类。它将对象的创建延迟到子类,实现解耦,提升扩展性与灵活性,符合开闭原则,适用于需要动态确定对象类型的场景。

工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它提供一个接口用于创建对象,但由子类决定要实例化的类。工厂方法模式将对象的实例化推迟到子类,从而使得代码更加灵活和可扩展。

  1. 工厂方法模式的结构
    工厂方法模式通常包含以下几个角色:

产品接口(Product):定义了工厂方法所创建的对象的接口。
具体产品(ConcreteProduct):实现了产品接口的具体类。
工厂接口(Creator):声明了一个工厂方法,返回一个产品对象。
具体工厂(ConcreteCreator):实现工厂接口,负责创建具体产品的实例。

  1. 工厂方法模式的 UML 图
    plaintext
    +-----------------+
    |     Creator     |
    +-----------------+
    | + factoryMethod()|
    +-----------------+
           / \
            |
    +-----------------+
    |                 |
    
    +-----------------+ +-----------------+
    | ConcreteCreator | | ConcreteCreator2|
    +-----------------+ +-----------------+
    | + factoryMethod()| | + factoryMethod()|
    +-----------------+ +-----------------+
      |                     |
      v                     v
    
    +-----------------+ +-----------------+
    | ConcreteProduct | | ConcreteProduct2|
    +-----------------+ +-----------------+
  2. 工厂方法模式的实现
    以下是一个 Python 中工厂方法模式的简单示例:

3.1 定义产品接口
python
from abc import ABC, abstractmethod

class Product(ABC):
@abstractmethod
def operation(self) -> str:
pass
3.2 实现具体产品
python
class ConcreteProductA(Product):
def operation(self) -> str:
return "Result of ConcreteProductA"

class ConcreteProductB(Product):
def operation(self) -> str:
return "Result of ConcreteProductB"
3.3 定义工厂接口
python
class Creator(ABC):
@abstractmethod
def factory_method(self) -> Product:
pass

def some_operation(self) -> str:
    product = self.factory_method()
    return f"Creator: The same creator's code has just worked with {product.operation()}"

3.4 实现具体工厂
python
class ConcreteCreatorA(Creator):
def factory_method(self) -> Product:
return ConcreteProductA()

class ConcreteCreatorB(Creator):
def factory_method(self) -> Product:
return ConcreteProductB()
3.5 使用工厂方法
python
def client_code(creator: Creator) -> None:
print(creator.some_operation())

if name == "main":
creator_a = ConcreteCreatorA()
client_code(creator_a) # 输出: Creator: The same creator's code has just worked with Result of ConcreteProductA

creator_b = ConcreteCreatorB()
client_code(creator_b)  # 输出: Creator: The same creator's code has just worked with Result of ConcreteProductB
  1. 工厂方法模式的优缺点
    优点
    解耦:客户端代码与具体产品的实现细节解耦,便于扩展和维护。
    提高灵活性:可以根据实际需要添加新的产品,而无需修改已有代码。
    符合开闭原则:对扩展开放,对修改关闭,可以在不修改现有代码的情况下添加新产品。
    缺点
    增加复杂性:引入额外的类和接口可能会导致系统的复杂性增加。
    难以理解:对于简单场景,工厂方法模式可能显得过于复杂。
  2. 何时使用工厂方法模式
    当一个类不知道它所需要的对象的类时。
    当一个类希望通过子类来指定它所创建的对象时。
    当一个类要将实例化操作延迟到子类时。
  3. 总结
    工厂方法模式是软件设计中的一种重要模式,通过定义一个创建对象的接口,使得子类决定具体的实例化过程,从而提高了代码的灵活性和可维护性。在实际开发中,根据需求合理选择是否使用工厂方法模式,有助于构建更清晰和可扩展的系统。
相关文章
|
2月前
|
缓存 JSON JavaScript
TypeScript 快速上手指南
TypeScript是JavaScript的超集,支持静态类型,提升代码质量与可维护性。本文涵盖环境搭建、核心语法、实战示例及工程化配置,零基础也能快速上手,适合Vue3、React等大型项目开发。
|
5月前
|
存储 虚拟化 Windows
VMware安装Windows10
本案例介绍了在Windows系统上使用VMware Workstation 17.5 Pro安装配置Windows 10虚拟机的详细步骤,包括所需设备、软件下载链接、虚拟机设置及系统安装全过程。
2585 133
VMware安装Windows10
|
2月前
|
存储 关系型数据库 MySQL
B+ 树索引
B+树是MySQL InnoDB引擎的核心索引结构,具自平衡、有序存储特性,支持高效查找、插入、删除。所有数据存于叶子节点,且叶节点相连,利于范围查询。广泛用于读密集、排序及范围检索场景,显著降低磁盘I/O,提升查询性能,是数据库优化的关键技术。
|
2月前
|
自然语言处理 关系型数据库 MySQL
MySQL 全文索引
MySQL全文索引支持对CHAR、VARCHAR、TEXT字段进行高效文本搜索,适用于文章、评论等长文本。通过MATCH()与AGAINST()实现自然语言或布尔模式查询,支持分词、停用词过滤和最小词长设置。可创建于建表时或后期添加,适用于搜索引擎、CMS、电商等场景,提升关键词检索效率,但需权衡增删改开销与索引维护成本。(238字)
|
2月前
|
存储 JSON JavaScript
JSON 快速上手指南
JSON是一种轻量级数据交换格式,语法严格,键名需双引号、值类型有限,支持跨语言解析。本文详解其语法规则、与JS对象区别、序列化/解析方法(stringify/parse)、实战应用及常见避坑技巧,助你快速掌握JSON核心技能。
|
2月前
|
JavaScript 前端开发 API
Vue.js 快速上手指南
Vue.js 是轻量级渐进式前端框架,核心聚焦视图层,上手简单、生态丰富。本文提供可直接复制的快速入门指南,涵盖 Vue3 组合式 API、响应式数据、指令、组件化、生命周期及 Axios 异步请求等实战内容,附完整示例与避坑提示,零基础也能快速搭建交互式页面,助力高效开发。
|
11月前
|
设计模式 Java 关系型数据库
设计模式:工厂方法模式(Factory Method)
工厂方法模式是一种创建型设计模式,通过将对象的创建延迟到子类实现解耦。其核心是抽象工厂声明工厂方法返回抽象产品,具体工厂重写该方法返回具体产品实例。适用于动态扩展产品类型、复杂创建逻辑和框架设计等场景,如日志记录器、数据库连接池等。优点包括符合开闭原则、解耦客户端与具体产品;缺点是可能增加类数量和复杂度。典型应用如Java集合框架、Spring BeanFactory等。
|
消息中间件 存储 网络协议
从零开始掌握进程间通信:管道、信号、消息队列、共享内存大揭秘
本文详细介绍了进程间通信(IPC)的六种主要方式:管道、信号、消息队列、共享内存、信号量和套接字。每种方式都有其特点和适用场景,如管道适用于父子进程间的通信,消息队列能传递结构化数据,共享内存提供高速数据交换,信号量用于同步控制,套接字支持跨网络通信。通过对比和分析,帮助读者理解并选择合适的IPC机制,以提高系统性能和可靠性。
1819 14
|
存储 安全 数据安全/隐私保护
Cookie 和 Session 的区别及使用 Session 进行身份验证的方法
【10月更文挑战第12天】总之,Cookie 和 Session 各有特点,在不同的场景中发挥着不同的作用。使用 Session 进行身份验证是常见的做法,通过合理的设计和管理,可以确保用户身份的安全和可靠验证。
863 156