大家好,在上篇文章当中我们给大家分享了抽象工厂这个设计模式。在介绍抽象工厂的时候,我们也对比了和工厂模式的区别,所以今天我们来看一下工厂模式的工作原理。

工厂模式

工厂模式的原理我们之前也曾经简单提到过,它的目的非常简单,就是把多个类的复杂初始化逻辑进行封装。通过简单的参数来控制创建的实例,对于使用者来说,不必关心创建当中的逻辑,而只需要关注参数就可以了。

其实和我们生活当中的工厂是非常类似的,对于每一家工厂而言,零件的生产过程是非常繁琐的。但是进料则要简单得多,比如钢铁厂的进料可能就只有铁矿石,一些器件厂的进料可能就只有钢材。

在工厂模式当中呢,简单的进料指的是工厂传入的参数,而工厂的产品对应某一个类的实例。

实现代码

严格说起来工厂模式有两种实现方式,一种是通过类实现,我们通过创建工厂类实例或者是调用工厂类当中的静态方法来创建我们需要的实例。还有一种方式是通过函数实现,效果是一样的。这两者的区别在于通过类的方式我们可以定义更多的参数以及更多的步骤,比如我们可以在工厂类初始化的时候加入更多的过程。而函数则适用于比较简单的创建逻辑,只需要简单的参数和过程就可以实现的场景。

这两者各有用途,并没有高下之说,也没有惯例说一定只能使用其中一种。我们根据自己的需求进行选择和修改即可。本文的例子将会采用函数创建的方式实现。

我们假设现在我们拥有各国的文本,需要进行一个翻译。显然各国的文字的翻译逻辑是不同的,如果使用机器学习的模型来翻译的话,那么需要使用的模型也会不一样。我们假设目前我们先支持两种语言,一种是英文一种是中文。由于只是举例,所以我们把逻辑省略和简化了。


class ChineseText:

    def __init__(self):
        self._text_dict = {'hello': '你好', 'China': '中国'}

    def translate(self, msg):
        return self._text_dict.get(msg, msg)


class EnglishText:

    def translate(self, msg):
        return msg
				

我们希望创建的函数可以根据我们传入的参数给我们返回对应的实例,如果是其他语言可能需要通过if-else判断参数的形式来进行,而Python支持将类也作为变量,所以会简单许多。我们来看代码,就只有两行:

def languageFactory(language='Chinese'):
    text_dict = {'Chinese': ChineseText, 'English': EnglishText}
    return text_dict[language]()
最后我们使用起来是这样的:

if __name__ == '__main__':
    chinese_text = languageFactory('Chinese')
    english_text = languageFactory('English')

    for m in 'hello China I love you'.split():
        print('{} {}'.format(chinese_text.translate(m), english_text.translate(m)))
				

这里我们在使用的时候只传入了一个表示语言的字符串就获得了对应语言的处理句柄,这里我们只是一个简单的例子。在实际的使用当中,像是ChineseText这种翻译类, 在初始化的时候需要执行大量的逻辑。比如说加载模型文件,然后设置一些参数,加载词表、语料库等等。但是对于使用者而言,这些过程都可以不必关心,他只需要知道传入的参数就可以了。

工厂模式非常简单,但是在一些复杂场景下会非常好用。尤其是当我们需要创建大量工具类的时候,就需要关注大量对应的参数和用法。并且很多类其实并不是自己团队开发的,还需要阅读文档或者是找到对应的负责人询问,非常不方便。有了工厂模式之后,我们就可以把一些常用的复杂的类进行封装在工厂当中,这样对于使用者而言,他就可以忽略这些不相关的逻辑了。

今天的文章就到这里,衷心祝愿大家每天都有所收获。如果还喜欢今天的内容的话,请来一个三连支持吧~(点赞、在看、转发)