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


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


比如我们想要给在创建不同类型的动物类的时候,对不同的动物添加不同的功能,


网络异常,图片无法展示
|
可以跑和跳,
网络异常,图片无法展示
|
可以跑和飞。


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...
相关文章
|
6月前
|
数据采集 自然语言处理 算法
如何使用Python的Gensim库进行自然语言处理和主题建模?
使用Gensim库进行Python自然语言处理和主题建模,包括:1) 安装Gensim;2) 导入`corpora`, `models`, `nltk`等相关模块;3) 对文本数据进行预处理,如分词和去除停用词;4) 创建字典和语料库;5) 使用LDA算法训练模型;6) 查看每个主题的主要关键词。代码示例展示了从数据预处理到主题提取的完整流程。
162 3
|
6月前
|
存储 Python
Python 的其他主题:解释 Python 中的命名空间(Namespace)是什么?
Python 的其他主题:解释 Python 中的命名空间(Namespace)是什么?
69 2
|
6月前
|
Python
Python 的其他主题:什么是 Duck Typing?Python 中如何使用 Duck Typing?
Python 的其他主题:什么是 Duck Typing?Python 中如何使用 Duck Typing?
50 0
|
4月前
|
设计模式 Ruby Python
Python实现工厂模式、抽象工厂怎么做?
**Python中的工厂模式**是设计模式的一种,用于灵活地创建对象。可以使用函数或类来实现。例如,一个简单的工厂函数创建`Product`对象
|
4月前
|
数据采集 自然语言处理 大数据
​「Python大数据」LDA主题分析模型
使用Python进行文本聚类,流程包括读取VOC数据、jieba分词、去除停用词,应用LDA模型(n_components=5)进行主题分析,并通过pyLDAvis生成可视化HTML。关键代码涉及数据预处理、CountVectorizer、LatentDirichletAllocation以及HTML文件的本地化处理。停用词和业务术语列表用于优化分词效果。
216 0
​「Python大数据」LDA主题分析模型
|
6月前
|
Python
Python 的其他主题:Python 中的 `__init__.py` 文件有什么作用?
Python 的其他主题:Python 中的 `__init__.py` 文件有什么作用?
75 1
|
5月前
|
设计模式 Python
Python教程:一文了解Python工厂模式
工厂模式是一种创建型设计模式,它用于创建对象的实例,而无需在客户端代码中指定具体的类。通过引入工厂类,客户端代码只需要与工厂接口进行交互,而不需要了解实际创建的对象的细节。这样可以将对象的创建和使用分离开来,提高了代码的灵活性和可维护性。
58 2
|
6月前
|
开发工具 Python
国外的大学图书馆也像国内的一样吗?用Python脚本抓取期刊的主题标题!
国外的大学图书馆也像国内的一样吗?用Python脚本抓取期刊的主题标题!
|
6月前
|
自然语言处理 数据可视化 算法
Python主题建模LDA模型、t-SNE 降维聚类、词云可视化文本挖掘新闻组数据集
Python主题建模LDA模型、t-SNE 降维聚类、词云可视化文本挖掘新闻组数据集
|
6月前
|
Python
Python 高级主题:什么是 Python 中的装饰器函数?
Python装饰器是一种特殊函数,用于在不修改原代码的情况下为函数增添功能。它们接收一个函数作为参数并返回一个新的函数,常在原函数前后添加额外操作。例如,`outer`装饰器会在`foo`函数执行前后打印信息并修改其返回值。调用`foo()`实则执行了装饰后的`inner`函数。
29 5