📜  Python中的工厂方法设计模式

📅  最后修改于: 2020-08-25 04:57:18             🧑  作者: Mango

介绍

在本文中,我们将深入探讨以Python实现的Factory Method Design Pattern。

设计模式定义了针对软件开发中各种反复出现的问题的久经考验的解决方案。它们并不代表实际的代码,而是代表我们可以组织代码以获得最佳结果的方式。

在资源有限的世界中,设计模式可帮助我们以最少的已用资源获得最大的结果。同样重要的是要注意,设计模式并不适用于所有情况,评估手头的问题以便为特定情况选择最佳方法至关重要。

设计模式分为几大类,尽管主要分为创造模式,结构模式和行为模式。

工厂方法模式是一种创新设计模式

工厂方法设计模式

定义

工厂方法在面向对象的编程中用作提供用于创建对象的工厂接口的方法。这些接口定义通用结构,但不初始化对象。初始化留给更具体的子类。

父类/接口包含所有可在不同类型的子类之间共享的标准行为和通用行为。子类又负责根据超类对对象进行定义和实例化。

动机

工厂方法设计模式背后的主要动机是通过创建抽象类来增强代码中的松散耦合,该抽象类将用于创建共享某些公共属性和功能的不同类型的对象。

这将提高灵活性和代码重用性,因为从同一个类继承了共享功能后将不会重写该共享功能。这种设计模式也称为虚拟构造函数

库方法通常通过允许客户选择要通过抽象类创建的对象的子类或类型来在库中使用。

工厂方法将接收有关所需对象的信息,将其实例化并返回指定类型的对象。这使我们的应用程序或库与其他程序或代码段进行单点交互,从而封装了对象创建功能。

工厂方法实施

我们的程序将成为一个用于在创建和其他操作(例如添加颜色和计算形状面积)方面处理形状对象的库。

用户应该能够使用我们的库来创建新对象。我们可以先创建单个单独的形状并按原样使用它们,但这意味着必须为我们拥有的每个形状重写许多共享逻辑。

解决此重复的第一步是创建一个父形状类,该类具有诸如calculate_area()和的方法calculate_perimeter()以及诸如尺寸之类的属性。

然后,特定的形状对象将从我们的基类继承。要创建形状,我们需要确定所需的形状并为其创建子类。

我们将从创建一个抽象类来代表通用形状开始:

import abc
class Shape(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def calculate_area(self):
        pass

    @abc.abstractmethod
    def calculate_perimeter(self):
        pass

这是我们所有形状的基类。让我们继续创建一些更具体的具体形状:

class Rectangle(Shape):
    def __init__(self, height, width):
        self.height = height
        self.width = width

    def calculate_area(self):
        return self.height * self.width 

    def calculate_perimeter(self):
        return 2 * (self.height + self.width) 

class Square(Shape):
    def __init__(self, width):
        self.width = width

    def calculate_area(self):
        return self.width ** 2

    def calculate_perimeter(self):
        return 4 * self.width

class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius

    def calculate_area(self):
        return 3.14 * self.radius * self.radius

    def calculate_perimeter(self):
        return 2 * 3.14 * self.radius

到目前为止,我们已经创建了一个抽象类,并将其扩展为适合库中可用的不同形状。为了创建不同的形状对象,客户将必须知道我们形状的名称和细节,并分别执行创建。