当前位置: 首页 > news >正文

【Python设计模式03】简单工厂模式

简单工厂模式(Simple Factory Pattern)是一种创建型设计模式,它通过专门定义一个工厂类来负责创建其他类的实例,而不是在客户端代码中直接实例化对象。这样可以将对象创建的过程与使用对象的过程分离,提高代码的可维护性和可扩展性。

简单工厂模式的结构

简单工厂模式包含以下角色:

  1. 工厂类(Factory):负责创建对象的类。根据不同的条件,实例化并返回不同类型的对象。
  2. 产品类(Product):由工厂创建的对象,所有创建的对象应实现相同的接口或继承相同的基类。
  3. 客户端(Client):使用工厂类来获取产品对象,而不直接实例化产品类。

示例

假设我们要创建一个简单的工厂类来生成不同类型的动物对象。首先,我们定义一个Animal基类,然后定义两个具体的产品类DogCat,最后创建一个工厂类AnimalFactory来生成这些对象。

定义产品类
class Animal:def speak(self):passclass Dog(Animal):def speak(self):return "Woof!"class Cat(Animal):def speak(self):return "Meow!"
定义工厂类
class AnimalFactory:@staticmethoddef create_animal(animal_type: str) -> Animal:if animal_type == 'dog':return Dog()elif animal_type == 'cat':return Cat()else:raise ValueError(f"Unknown animal type: {animal_type}")
使用工厂类
def main():factory = AnimalFactory()dog = factory.create_animal('dog')print(dog.speak())  # 输出:Woof!cat = factory.create_animal('cat')print(cat.speak())  # 输出:Meow!try:unknown = factory.create_animal('bird')except ValueError as e:print(e)  # 输出:Unknown animal type: birdif __name__ == "__main__":main()

简单工厂模式的优缺点

优点
  1. 单一职责原则:工厂类负责对象的创建,客户端代码负责使用对象,各自关注自己的职责。
  2. 提高可维护性:将对象创建的逻辑集中在一个地方,便于修改和维护。
  3. 提高可扩展性:如果需要添加新的产品,只需修改工厂类而不需要修改客户端代码。
缺点
  1. 违反开闭原则:每次添加新产品时,都需要修改工厂类,增加了工厂类的复杂性。
  2. 单一工厂类过于复杂:随着产品种类的增加,工厂类可能变得臃肿,难以维护。

简单工厂模式的适用场景

  1. 对象创建过程复杂:如果对象的创建过程较为复杂,或者需要根据不同条件创建不同类型的对象,可以使用简单工厂模式。
  2. 客户端不需要知道具体产品类:客户端只需要使用工厂类来获取对象,不需要了解具体的产品类。

总结

简单工厂模式是一种创建型设计模式,通过定义一个工厂类来创建不同类型的对象,将对象创建的过程与使用对象的过程分离,提高代码的可维护性和可扩展性。尽管简单工厂模式有一些缺点,如违反开闭原则,但在某些场景下仍然非常有用。通过合理使用简单工厂模式,可以有效地简化对象的创建过程,提升代码的质量。

http://www.lryc.cn/news/351431.html

相关文章:

  • java中的Collections类+可变参数
  • SpringBoot集成腾讯云敏感词校验API流程
  • android 避免混淆类名和方法名,但是方法内容需要被混淆
  • 通过ELRepo修改CentOS 7内核版本的详细步骤
  • C++开源库glog使用封装--自定义日志输出格式,设置日志保留时间
  • linux rc.local不生效
  • ROS2入门21讲__第07讲__节点:机器人的工作细胞
  • k8s node NotReady后会发生什么?
  • uni-starter创建App项目最全流程(日后还有其他功能会不断更新)
  • 动态IP和静态IP区别
  • 蓝牙(2):BR/EDR的连接过程;查询(发现)=》寻呼(连接)=》安全建立=》认证=》pair成功;类比WiFi连接过程。
  • 源码部署EFK
  • CSDN智能总结助手
  • setImmediate是在当前事件循环的所有周期的末尾执行,还是再当前事件循环的当前周期的下一个周期执行?
  • 建材行业工程设计资质动态核查不通过怎么办
  • 二叉数之插入操作
  • 【Python】全局变量与init的区别
  • JAVA学习-练习试用Java实现“位1的个数”
  • HTML静态网页成品作业(HTML+CSS)——魅族商城首页网页(1个页面)
  • Windows DNS 服务器配置转发器
  • 基于FPGA的VGA协议实现----条纹-文字-图片
  • hdfs中MapReduce中的shuffle,combine和partitioner(hadoop,Hdfs)
  • Linux应用入门(二)
  • 高仿果汁导航模板
  • 机器学习之一分类支持向量机(One-class SVM)
  • 签发免费https证书的方式
  • Autodl服务器中Faster-rcnn(jwyang)训练自己数据集(二)
  • 安卓手机文件误删或丢失?教你快速找回的方法!
  • C语言 | Leetcode C语言题解之第108题将有序数组转换为二叉搜索树
  • 关于在企业环境中中间人攻击(MITM)可行性研究的报告