Python的工厂模式 | Python 主题月

本文正在参加「Python主题月」,详情查看 活动链接

当我们需要根据不同的输入或条件产生不同的类的时候,我们就需要用到工厂模式。工厂模式可以让我们不关注内部逻辑,只需要输入对应的参数,工厂就会生产出我们需要的产品(类)。

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、工厂模式

为了能够在创建类的时候扩展其功能,我们在工厂类中只提供增加,查询接口,而不直接生产类。这种模式就是工厂模式。

比如我们想要给在创建不同类型的动物类的时候,对不同的动物添加不同的功能,image.png可以跑和跳,image.png可以跑和飞。

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...
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享