Python工厂模式介绍、使用

一、Python中的工厂模式介绍

Python中的工厂模式是一种常用的创建型设计模式,其主要作用是封装对象的实例化过程,从而将客户端代码与具体类的实现分离开来,提高程序的可维护性和可扩展性。下面是工厂模式的详细介绍:

  • 概念:工厂模式是一种创建型设计模式,通过定义一个工厂类,将对象的实例化过程封装起来。客户端只需要通过工厂类获取所需的对象即可,而无需直接调用具体类的构造函数。

  • 优点:工厂模式可以提高代码的灵活性和可维护性,客户端代码和具体类的实现之间松耦合,当需要新增或更改某个具体类时,只需要修改工厂类即可,无需修改客户端代码。

  • 缺点:由于增加了工厂类的复杂性,会增加代码的复杂性和理解难度。

  • 应用场景:当需要实例化多个相似的对象时,可以使用工厂模式来封装实例化过程。同时,工厂模式还可以用于隐藏对象的实现细节,提高程序的安全性。

  • 使用方法:

(1)定义一个工厂类,其中包含一个工厂方法,用于实例化具体对象。

(2)定义一个抽象类或接口,所有具体类都实现这个接口。

(3)在客户端代码中,通过调用工厂类的工厂方法获取所需的对象。

定义抽象类的模块和语法

from abc import ABCMeta, abstractmethod 是 Python 中用于定义抽象类的模块和语法。

首先,"abc" 表示 Abstract Base Classes(抽象基类) 的缩写,是 Python 标准库中的一个模块,通常用于定义抽象类,它定义了一个元类 ABCMeta 和一个装饰器 @abstractmethod。

其中,ABCMeta 是抽象类的元类,它用于定义抽象类,使得这些类不能被直接实例化,只能被其它类继承,并重写其中标记为 @abstractmethod 装饰器的方法。

@abstractmethod 装饰器用于定义抽象方法,即在抽象类中定义的方法,但是并不实现具体的逻辑,这些逻辑应该在继承抽象类的子类中实现。在子类中必须重写抽象方法,否则会在实例化时抛出 TypeError 异常。

举个例子:

from abc import ABCMeta, abstractmethod

class MyABC(metaclass=ABCMeta):
  
    @abstractmethod
    def do_something(self):
        pass

class MyClass(MyABC):
    
    def do_something(self):
        print("Doing something in MyClass")

上面的代码中,定义了一个抽象类 MyABC,其中包含一个抽象方法 do_something,这个方法在父类中只是一个声明,没有具体的实现。然后定义了一个 MyClass 类,它继承了 MyABC 抽象类,并重写了 do_something 方法,这样 MyClass 就可以实例化并正常调用 do_something 方法了。

示例

下面是一个简单的示例代码:



# 工厂模式(Factory Pattern):定义一个用于创建对象的接口,让子类决定实例化哪个类。工厂方法使一个类的实例化延迟到其子类。分类中又分为简单工厂、工厂方法和抽象工厂。

'''
"abc" 表示 Abstract Base Classes(抽象基类) 的缩写,是 Python 标准库中的一个模块,通常用于定义抽象类,它定义了一个元类 ABCMeta 和一个装饰器 @abstractmethod。
ABCMeta 是抽象类的元类,它用于定义抽象类,使得这些类不能被直接实例化,只能被其它类继承,并重写其中标记为 @abstractmethod 装饰器的方法。
@abstractmethod 装饰器用于定义抽象方法,即在抽象类中定义的方法,但是并不实现具体的逻辑,这些逻辑应该在继承抽象类的子类中实现。在子类中必须重写抽象方法,否则会在实例化时抛出 TypeError 异常。
'''

from abc import ABCMeta, abstractmethod
# 定义抽象类
class My_abc(metaclass=ABCMeta):
    @abstractmethod
    def test(self):
        # print("test_fun")
        pass

# 定义具体类, 继承抽象类,重写test方法
class My_class1(My_abc):
    def test(self):
        return "my_class1 test"

# 定义具体类, 继承抽象类,重写test方法
class My_class2(My_abc):
    def test(self):
        return "my_class2 test"

# 定义工厂类
class fac_class:
    def class_num(self,type):
        if type == "class1":
            return My_class1()
        elif type == "class2":
            return My_class2()

my_class1 = My_class1()
print(my_class1.test())

my_class2 = My_class2()
print(my_class2.test())

print("在代码中使用工厂模式")
fac = fac_class()

c1 = fac.class_num("class1")
c2 = fac.class_num("class2")

print(c1)
print(c2)

print(c1.test())
print(c2.test())

上述代码中,

My_abc是一个抽象类,定义了一个test抽象方法,所有具体类都必须实现这个方法。

My_class1和My_class2是两个具体类,分别实现了My_abc类的test方法。

fac_class是一个工厂类,其中包含一个class_num方法,用于根据传入的参数实例化具体的对象。

在客户端代码中,通过调用fac_class的class_num方法获取所需要的对象。

运行结果:

my_class1 test
my_class2 test
在代码中使用工厂模式
<__main__.My_class1 object at 0x000002458E1DDB50>
<__main__.My_class2 object at 0x000002458E1DDB90>
my_class1 test
my_class2 test

猜你喜欢

转载自blog.csdn.net/songpeiying/article/details/131856199