一、抽象工厂模式介绍
概念:
Python 抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种创建对象的方式,用于创建一系列相关或相互依赖的对象。它为客户端提供了一种创建对象的接口,而不需要指定具体实现。
功能:
抽象工厂模式提供了一种创建一系列相关或相互依赖的对象的方式,使得对象的创建与使用分离开来,从而提高了代码的灵活性和可维护性。
优点:
- 抽象工厂模式可以帮助我们更好地组织代码,提高代码的可维护性和可扩展性。
- 抽象工厂模式可以将对象的创建与使用分离开来,使得对象的创建更加灵活和可控。
- 抽象工厂模式可以保证一系列相关的对象都能够被正确创建和使用。
- 抽象工厂模式可以帮助我们实现代码的解耦合,使得代码更加清晰、易于理解。
缺点:
- 抽象工厂模式的实现需要一定的编程经验和技巧,需要额外的工作量和学习成本。
- 抽象工厂模式的实现可能会增加代码的复杂性,特别是在需要创建大量对象时。
抽象工厂模式通常应用于以下场景:
- 需要创建一系列相关或相互依赖的对象。
- 需要在不同的操作系统或平台上使用不同的实现。
- 需要提供一种灵活的创建对象的方式,以便更好地组织代码。
使用方式:
抽象工厂模式的实现需要定义一个抽象工厂类和多个具体工厂类,每个具体工厂类都可以创建一系列相关的对象,具体工厂类都需要实现抽象工厂类中定义的创建方法。
抽象工厂模式在应用程序开发中经常被使用,例如:
- GUI界面开发中,可以使用抽象工厂模式创建不同的UI控件。
- 游戏开发中,可以使用抽象工厂模式创建不同类型的游戏角色。
- 数据库访问层中,可以使用抽象工厂模式创建不同的数据库驱动程序。
- 操作系统API开发中,可以使用抽象工厂模式创建不同的系统调用。
二、使用
示例一:
下面以制造汽车为例,说明Python 抽象工厂模式的使用方式。假设我们需要制造两种不同种类的汽车:基础版和高级版,每种汽车又可以分为两个品牌:A品牌和B品牌,其中每个品牌有引擎、轮胎和座椅三个部件。
首先,我们需要定义抽象工厂类和多个具体工厂类,如下所示:
然后,我们需要定义每个部件的抽象基类和具体实现类,如下所示:
最后,在客户端调用程序中,我们可以通过实例化不同的具体工厂类来创建不同品牌的汽车,如下所示:
# 步骤一:定义抽象工厂类
class carFac():# 定义抽象工厂类def create_engine(self):# 引擎passdef create_tire(self): # 轮胎passdef create_seat(self): # 座椅pass# 步骤二:定义具体工厂类
class carFacA(carFac): # 定义具体工厂类:继承抽象工厂类,实现抽象工厂类定义的创建方法,返回抽象基类定义的方法def create_engine(self): # 引擎return engineA()def create_tire(self): # 轮胎return tireA()# def create_seat(self): # 座椅# return seatA()class carFacB(carFac):def create_engine(self): # 引擎return engineB()def create_tire(self): # 轮胎return tireB()# def create_seat(self): # 座椅# return seatB()#步骤三: 定义抽象基类的具体实现方法
class engine(): # 定义抽象基类def work(self):passclass engineA(engine): # 定义具体实现类def work(self):print("engine A is working...")class engineB(engine):def work(self):print("engine B is working...")class tire(): # 定义抽象基类def run(self):passclass tireA(tire): # 定义具体实现类def run(self):print("tire A is runing...")class tireB(tire):def run(self):print("tire B is runing...")fac1 = carFacA()
eng1 = fac1.create_engine()
tir1 = fac1.create_tire()
eng1.work()
tir1.run()fac2 = carFacB()
eng2 = fac2.create_engine()
tir2 = fac2.create_tire()
eng2.work()
tir2.run()
运行结果:
engine A is working...
tire A is runing...
engine B is working...
tire B is runing...
上述程序中,客户端通过实例化不同的具体工厂类,即可创建不同品牌的汽车,每个汽车又都由引擎、轮胎和座椅三个部件组成,这些部件都是由具体实现类完成的。这样,我们就成功地使用抽象工厂模式实现了汽车的制造过程。
示例二:
下面以操作系统系统调用为例,说明Python 使用抽象工厂模式创建不同的系统调用。假设我们有两个操作系统,分别为Windows和Linux,我们需要在两个操作系统上实现不同的系统调用。
首先,我们需要定义抽象工厂类和多个具体工厂类,如下所示:
# 定义抽象工厂类
class SystemCallFactory():def create_open(self):passdef create_read(self):passdef create_write(self):pass# 定义具体工厂类WindowsSystemCallFactory
class WindowsSystemCallFactory(SystemCallFactory):def create_open(self):return WindowsOpen()def create_read(self):return WindowsRead()def create_write(self):return WindowsWrite()# 定义具体工厂类LinuxSystemCallFactory
class LinuxSystemCallFactory(SystemCallFactory):def create_open(self):return LinuxOpen()def create_read(self):return LinuxRead()def create_write(self):return LinuxWrite()
然后,我们需要定义每个系统调用的抽象基类和具体实现类,如下所示:
# 定义打开文件系统调用抽象基类
class Open():def open_file(self):pass# 定义Windows打开文件系统调用具体实现类
class WindowsOpen(Open):def open_file(self):print("Windows open file...")# 定义Linux打开文件系统调用具体实现类
class LinuxOpen(Open):def open_file(self):print("Linux open file...")# 定义读取文件系统调用抽象基类
class Read():def read_file(self):pass# 定义Windows读取文件系统调用具体实现类
class WindowsRead(Read):def read_file(self):print("Windows read file...")# 定义Linux读取文件系统调用具体实现类
class LinuxRead(Read):def read_file(self):print("Linux read file...")# 定义写入文件系统调用抽象基类
class Write():def write_file(self):pass# 定义Windows写入文件系统调用具体实现类
class WindowsWrite(Write):def write_file(self):print("Windows write file...")# 定义Linux写入文件系统调用具体实现类
class LinuxWrite(Write):def write_file(self):print("Linux write file...")
最后,在客户端调用程序中,我们可以通过实例化不同的具体工厂类来创建不同操作系统上的系统调用,如下所示:
# 客户端程序
if __name__ == '__main__':factory1 = WindowsSystemCallFactory()open1 = factory1.create_open()read1 = factory1.create_read()write1 = factory1.create_write()open1.open_file()read1.read_file()write1.write_file()factory2 = LinuxSystemCallFactory()open2 = factory2.create_open()read2 = factory2.create_read()write2 = factory2.create_write()open2.open_file()read2.read_file()write2.write_file()
上述程序中,客户端通过实例化不同的具体工厂类,即可创建不同操作系统上的系统调用,每个系统调用又都由打开文件、读取文件和写入文件三个基本操作组成,这些操作都是由具体实现类完成的。这样,我们就成功地使用抽象工厂模式实现了在不同操作系统上的系统调用。
运行结果:
Windows open file...
Windows read file...
Windows write file...
Linux open file...
Linux read file...
Linux write file...