当我们需要根据不同的输入或条件产生不同的类的时候,我们就需要用到工厂模式。工厂模式可以让我们不关注内部逻辑,只需要输入对应的参数,工厂就会生产出我们需要的产品(类)。
1、简单工厂模式
简单工厂模式直接在工厂类进行逻辑处理和类的生产,简单易用,但是可扩展性差。
比如我们现在有一个需求,需要输入不同的动物名称就能拿到对应的类:
from abc import ABCMeta,abstractmethod class Animal(metaclass = ABCMeta): @abstractmethod #抽象方法,子类必须实现这个方法 def say(self): pass class Dog(Animal): #继承Animal类并且实现say方法 def say(self): return 'wang...' class Cat(Animal): def say(self): return 'miao...' class AnimalFactory: ''' 简单工厂类在工厂类中直接根据业务逻辑,创建了具体的类 ''' def product_animal(self,animal_type): return eval(animal_type)().say() if __name__ == "__main__": producter = AnimalFactory() res1 = producter.product_animal('Dog') print(res1) res2 = producter.product_animal('Cat') print(res2) 复制代码
运行结果:
wang... miao... 复制代码
2、工厂模式
为了能够在创建类的时候扩展其功能,我们在工厂类中只提供增加,查询接口,而不直接生产类。这种模式就是工厂模式。
比如我们想要给在创建不同类型的动物类的时候,对不同的动物添加不同的功能,
网络异常,图片无法展示
|
网络异常,图片无法展示
|
from abc import ABCMeta,abstractmethod class Animal(metaclass = ABCMeta): @abstractmethod #抽象方法,子类必须实现这个方法 def function(self): pass class Run(Animal): def function(self): return 'run...' class Jump(Animal): def function(self): return 'jump...' class Fly(Animal): def function(self): return 'fly...' class AnimalFactory(metaclass = ABCMeta): ''' 工厂方法类,提供生产类的接口,不直接生产类 ''' def __init__(self): self.function=[] self.product_animal() @abstractmethod def product_animal(self): pass def getFunction(self): return self.function def addFunction(self,func): self.function.append(func) # 创建对象和逻辑在下面进行 # 我们可以根据需要在生产类的时候增加其功能 class Frog(AnimalFactory): def product_animal(self): self.addFunction(Run()) self.addFunction(Jump()) class Chicken(AnimalFactory): def product_animal(self): self.addFunction(Run()) self.addFunction(Fly()) if __name__ == "__main__": bird=Chicken() for f in bird.function: print('chicken can:',f.function()) dog=Frog() for f in dog.function: print('frog can:',f.function()) 复制代码
运行结果:
chicken can: run... chicken can: fly... frog can: run... frog can: jump...