设计模式介绍和实现:工厂方法模式(Factory Method Pattern)

news/2025/3/23 15:16:05/

一、概念介绍
工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它提供了一种将对象创建的过程延迟到子类中进行的方法。这种模式通过定义一个创建对象的接口,但将具体的实现延迟到子类来完成,从而使得一个类在实例化时可以通过其子类来决定实例化哪个类。这样可以提高代码的灵活性和可扩展性。

工厂方法模式包含以下几个角色:
抽象产品(Abstract Product):定义了工厂方法模式所创建的对象的接口,通常是一个抽象类或接口。
具体产品(Concrete Product):实现了抽象产品接口,是工厂方法模式所创建的对象的具体实现类。
抽象工厂(Abstract Factory):定义了一个创建产品的工厂方法接口,通常是一个抽象类或接口。这个接口中通常会包含一个或多个工厂方法,用于创建具体产品的实例。
具体工厂(Concrete Factory):实现了抽象工厂接口,负责创建具体产品的实例。

优点:
松耦合性工厂方法模式将客户端与具体产品的实现分离,客户端只需知道产品的抽象类型,无需关心具体的实现细节,从而降低了客户端和具体产品之间的耦合性。
可扩展性:通过添加新的具体工厂和具体产品类,可以很方便地扩展系统的功能,而无需修改现有的代码。
符合开闭原则:对扩展开放、对修改关闭。增加新的产品类时,无需修改已有代码,只需添加新的具体产品类和具体工厂类即可。

缺点:
类的个数增加:引入了多个工厂类和产品类,使得系统中的类的数量增加,增加了代码的复杂度和维护成本。
增加了系统的抽象性和理解难度:工厂方法模式引入了更多的抽象层次,使得系统更加灵活,但也增加了理解和学习的难度。
工厂方法模式适用于以下情况:

当一个类不知道它所需要的对象的类时。
当一个类希望由它的子类来指定它所创建的对象时。
当类将创建对象的职责委托给多个帮助子类中的其中一个,并且想让子类中的某一个类来实例化这个类时。

二、实现方法
1、简单工厂模式

2、正常工厂模式

3、抽象工厂模式


http://www.ppmy.cn/news/1454122.html

相关文章

海外私人IP和原生IP有什么区别,谁更有优势?

海外私人IP和原生IP在定义、特性以及应用场景上均存在显著的差异,各自的优势也因其特性而异。下面将详细探讨这两者的区别及各自的优势。 海外私人IP通常指的是一种位于海外的网络服务,它允许用户通过代理服务器访问海外网络,获取并使用位于…

视频号小店怎么做?店铺运营流程分享,超详细攻略来了

大家好,我是电商笨笨熊 视频号小店刚推出不久,平台对于新店铺扶持力度较大,再加上空白的市场,在这里到处充满着机会; 因此在视频号刚推出电商项目后,我们就开始入手,截止现在已经一年半的时间…

机械臂标准DH建模及正运动学分析(以IRB4600型工业机械臂为例)

1. 前言 对于工业机械臂而言,运动学是不考虑力学特性的情况下对机械臂的几何参数与其位置、速度、加速度等运动特性的关系研究。DH建模是运动学的基础,全称为Denavit-Hartenberg建模方法,是一种广泛应用于机器人运动学中的建模技术。该方法通…

Docker知识点汇总表格总结

Docker容器给我的一个很直观的感受就是将项目以及中间件安装变得比较简单直接,运行维护起来也更方便。之前做的一些微服务项目也是用docker来部署,现在很多开源的项目也流行使用docker来部署,简化了很多手动安装和配置的步骤,将项…

kan 这是什么(想多了哈哈)

代码 import paddleclass Xus(paddle.nn.Layer):def __init__(self, head, head_dim):super().__init__()self.x_layer paddle.nn.Linear(head_dim, head * head_dim, bias_attrFalse)self.s_layer paddle.nn.Linear(head_dim, head * head_dim, bias_attrFalse)self.u_laye…

Rust Turbofish 的由来

0x01 什么是 Turbofish 我们运行如下 Rust Snippet&#xff1a; fn main() {let numbers: Vec<i32> vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];let even_numbers numbers.into_iter().filter(|n| n % 2 0).collect();println!("{:?}", even_numbers); }不出意…

牛客NC382 切割木头【中等 二分超找 Java/Go/C++】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/707d98cee255448c838c76918a702be0 核心 二分查找Java代码 import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可…

Git知识点汇总表格总结

Git应该是现在各个做开发公司使用最广泛的版本管理工具了&#xff0c;还有一些公司可能用的SVN&#xff0c;不过总体来说&#xff0c;Git绝对是主流&#xff0c;SVN是集中式版本管理&#xff0c;使用起来相对Git更简单&#xff0c;不过功能相对Git也略显简略&#xff0c;Git的优…