设计模式——把类作为参数的抽象工厂模式

今天给大家介绍一个非常简单的设计模式,一学就会,非常好用。

这个模式叫做抽象工厂模式,大家可能对工厂模式比较熟悉,在工厂模式当中封装了实例的创建逻辑。主要的用途一般是将一些复杂的类的创建过程整合在一起,通过参数控制,这样使用者可以较简单地获得实例。

抽象工厂

抽象工厂模式和工厂模式类似,只不过更加抽象了一层。在创建实例的时候,不是通过参数来控制,而是直接传入想要创建的类。这一点其实也是Python的特性,一切皆是对象,一切皆可传参,类本身也是一个对象,类也是可以传参的。所以我们可以把一个类直接传入工厂,工厂通过类来创建实例。

我们来用代码简单演示一下:

class AbstractFactory:    def __init__(self, cls):        self.cls = cls            def build(self, *args, **kw):        return self.cls(*args, **kw)

这段代码大家都能看懂,但是这其实也不能完全叫做抽象工厂,因为体现不出来抽象。这里的抽象主要是把工厂当做了一个更高阶的抽象类,有点像是抽象类的反向使用。

我们一般使用抽象类都是这样:

import abcclass AbstractClass:    def __init__(self):        pass        @abc.abstractmethod    def run(self, *args, **kw):        pass

然后它的派生类再去实现抽象类当中定义的抽象方法,而这里的顺序则是反的。父类当中的逻辑其实也是定好的,只是它在具体执行的时候是调用传入的子类实例实现的。

为了更好说明,我们来看一个例子吧:

class PetCollection(object):    def __init__(self, animal):        self.pet_generator = animal        self.pet = self.pet_generator()        def speak(self):        self.pet.speak()    def show_pet(self):        pet = self.pet        print('Pet\'s name is {}'.format(pet))        print('It says: {}!'.format(pet.speak()))class Dog(object):    def speak(self):        return 'woof'    def __str__(self):        return 'dog'class Cat(object):    def speak(self):        return 'meow'    def __str__(self):        return 'cat'if __name__ == '__main__':    pet = PetCollection(Dog)    pet.show_pet()

在这个例子当中,Dog和Cat是子类,PetCollection是父类。我们可以发现在父类当中也实现了speak这个方法,但是它是调用子类的speak实现的。也就是说凡是拥有speak这个类的子类都可以用来创建PetCollection,这个PetCollection相当于一个抽象的通用类,这样我们在使用的时候可以用它来集成很多逻辑,简化操作。

我第一次看这个设计模式的时候,觉得普普通通,不过是把类当做参数而已。但是之后又看了一次,又有了新的理解,这不也是抽象类的反向使用吗?其实代码的核心就只有逻辑,所谓的设计模式也不过是前人总结出的经验而已。真正有价值的并不是这个模式当中的代码怎么写,而是核心的逻辑,这些融会贯通了,以后也不难设计出我们自己的模式来。

今天的文章就到这里,衷心祝愿大家每天都有所收获。如果还喜欢今天的内容的话,不要忘了三连。

(0)

相关推荐

  • 一日一技:在 Python 中编写抽象类

    摄影:产品经理 游玩:产品经理&kingname 在极客时间某设计模式相关的课程中,某老师说 Python 不支持抽象类和接口. 但实际上,Python 支持抽象类. Python 自带的ab ...

  • PHP设计模式之抽象工厂模式

    PHP设计模式之抽象工厂模式 工厂模式系列中的重头戏来了,没错,那正是传闻中的抽象工厂模式.初次听到这个名字的时候你有什么感觉?反正我是感觉这货应该是非常高大上的,毕竟包含着"抽象" ...

  • [PHP小课堂]PHP设计模式之抽象工厂模式

    [PHP小课堂]PHP设计模式之抽象工厂模式 关注公众号:[硬核项目经理]获取最新文章 添加微信/QQ好友:[DarkMatterZyCoder/149844827]免费得PHP.项目管理学习资料

  • 【重温设计模式】之004抽象工厂模式

    [重温设计模式系列源码] 抽象工厂模式 基本原理 含义 抽象工厂模式,即Abstract Factory Pattern,提供一个创建一系列相关或相互依赖对象的接口, 而无须指定它们具体的类:具体的工 ...

  • 设计模式-创建型-抽象工厂模式

    前一章节,我们介绍了简单工厂模式以及工厂方法模式,但是这两种模式都存在一定的局限性,只能生产某一类型下的某一种产品,如果需求变更,同类型下出现了不同的产品,比如芝士披萨不仅有口味上的不同,同时存在外观 ...

  • 创建型设计模式--工厂模式、抽象工厂模式

    一.小案例分析 1.功能需求: 实现一个发送信息的功能,要便于扩展与维护. (1)发送信息的工具有很多,比如短信.微信.邮件.QQ等. (2)选择某个工具进行信息发送. 2.小菜鸡去实现: (1)定义 ...

  • 【设计模式】(四)抽象工厂模式(Abstract Factory Pattern)

    【设计模式】(四)抽象工厂模式(Abstract Factory Pattern)

  • 设计模式——抽象工厂模式

    抽象工厂方法_将关联组件组装成产品 ** * 印刷抽象工厂类 * @author maikec * 2019/5/20 */ public abstract class AbstractPrintin ...

  • 【8/25】使用抽象工厂模式(Abstract Factory Pattern) 封装页面对象的创建过程

    这是<小游戏从0到1设计模式重构>系列内容第8篇,所有源码及资料在"程序员LIYI"公号回复"小游戏从0到1"获取. 看完了三姐妹中的大姐.二姐,最 ...

  • AbstractFactoryPattern抽象工厂模式

    抽象工厂模式 1.定义 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类. 以女娲造人为例,定义人种(Product产品类)及八卦炉(工厂类).为人类定义肤色及性别属性,从设计角度 ...