02、Python设计模式:工厂模式

简介

工厂模式是一种创建型设计模式,它提供了一种方法来创建对象,而无需指定将要创建的对象的确切类型。工厂模式的目的是封装对象的创建过程,并将其委托给工厂类来处理,从而提高代码的可维护性和可扩展性。

在工厂模式中,我们定义一个工厂类,它负责根据输入的参数来创建不同的对象,并返回这些对象的引用。这个工厂类可以隐藏对象的创建细节,使得客户端代码只需要知道如何调用工厂类的方法来获取所需的对象,而不需要知道对象的具体创建过程。

工厂模式有很多不同的变体,包括简单工厂模式、工厂方法模式和抽象工厂模式等。简单工厂模式是最基本的工厂模式,它使用一个静态方法或函数来创建对象。工厂方法模式通过将对象的创建延迟到子类中来提高灵活性,而抽象工厂模式则通过创建一组相关的对象来提供更高级别的抽象。

优点:

1、 将对象的创建和使用分离:工厂模式可以将对象的创建和使用分离开来,客户端只需要知道需要什么对象,而不需要关心对象的创建过程,这样可以降低客户端代码的复杂度;
2、 提高代码的可维护性和可扩展性:当需要增加新的产品时,只需要添加一个新的具体产品类和相应的工厂类即可,不需要修改原有的代码,这样可以提高代码的可维护性和可扩展性;
3、 降低耦合度:工厂模式可以降低客户端和具体产品类之间的耦合度,因为客户端只需要通过工厂类来创建对象,不需要直接调用具体产品类的构造函数;
4、 封装了创建对象的细节:工厂模式将对象的创建过程封装起来,客户端无法直接访问具体产品类的构造函数,从而保证了对象创建过程的安全性和一致性;
5、 支持多态性:工厂模式可以通过抽象工厂类和抽象产品类来支持多态性,从而使得代码更加灵活和可扩展;

缺点

1、 增加了代码复杂度:工厂模式需要定义一个工厂类来创建对象,这会增加代码量和复杂度,特别是当有多个产品族或产品等级时,代码会变得更加复杂;
2、 增加了系统的抽象性和理解难度:工厂模式将对象的创建过程封装在工厂类中,这增加了系统的抽象性,也使得代码更加难以理解;
3、 增加了系统的开销:在工厂模式中,每次创建对象都需要通过工厂类来完成,这增加了系统的开销,特别是在大规模创建对象时;
4、 不容易对修改封闭:工厂模式需要创建一个工厂类来创建对象,这会导致代码的耦合性增加,从而使得系统更加难以对修改封闭;
5、 可能会导致滥用:由于工厂模式可以隐藏对象的创建细节,因此可能会导致滥用,从而使得代码更加难以维护和理解;

应用场景

1、 复杂的对象创建过程:如果对象的创建过程比较复杂,涉及到多个步骤和条件判断等,可以使用工厂模式来封装对象的创建过程,从而使得客户端代码更加简洁和易于维护;
2、 对象的创建需要根据不同的条件来选择不同的实现:如果需要根据不同的条件来选择不同的实现,可以使用工厂模式来封装对象的创建过程,从而使得客户端代码不需要关心对象的创建细节,只需要调用工厂类的方法即可;
3、 动态切换对象类型:如果需要动态切换对象的类型,可以使用工厂模式来封装对象的创建过程,从而实现运行时动态切换对象的类型;
4、 多个地方需要创建相同类型的对象:如果需要在多个地方创建相同类型的对象,可以使用工厂模式来封装对象的创建过程,从而避免代码的重复性,提高代码的可维护性和可扩展性;
5、 需要将对象的创建和使用分离:如果需要将对象的创建和使用分离,可以使用工厂模式来实现这个功能,从而使得客户端代码更加灵活和可扩展;
6、 在通信系统中,高层通信协议会很多样化,同时,上层协议依赖于下层协议,那么就可以对应建立对应层级的抽象工厂,根据不同的“产品需求”去生产定制的实例;

代码实现(最简)

假设我们要创建一个图形库,其中包含多个不同类型的图形,如圆形、矩形、三角形等。为了封装对象的创建过程,我们可以使用工厂模式来实现这个功能。具体实现如下:

class Shape:
    def draw(self):
        pass

class Circle(Shape):
    def draw(self):
        print("Drawing a circle...")

class Rectangle(Shape):
    def draw(self):
        print("Drawing a rectangle...")

class Triangle(Shape):
    def draw(self):
        print("Drawing a triangle...")

class ShapeFactory:
    def create_shape(self, shape_type):
        if shape_type == "circle":
            return Circle()
        elif shape_type == "rectangle":
            return Rectangle()
        elif shape_type == "triangle":
            return Triangle()
        else:
            raise ValueError("Invalid shape type")

版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: