当前位置: 首页 > 科技观察

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

时间:2023-03-22 11:41:55 科技观察

今天给大家介绍一个非常简单的设计模式,一学就会非常好用。这种模式称为抽象工厂模式。你可能熟悉工厂模式,它封装了实例的创建逻辑。主要目的一般是把一些复杂的类的创建过程整合起来,通过参数来控制,让用户更方便的获取实例。抽象工厂抽象工厂模式与工厂模式类似,但更加抽象。创建实例时,不受参数控制,而是直接传入你要创建的类。这其实是Python的一个特性。一切都是对象,一切都可以作为参数传递。类本身也是一个对象,类也可以作为参数传递。所以我们可以直接将一个类传入工厂,工厂通过类创建实例。下面用代码简单演示一下:classAbstractFactory:def__init__(self,cls):self.cls=clsdefbuild(self,*args,**kw):returnsself.cls(*args,**kw)这个代码大家可以用我明白,但是这个不能叫抽象工厂,因为它不能体现抽象。这里的抽象主要是把工厂当成一个更高层的抽象类,有点像抽象类的逆向使用。我们一般会这样使用抽象类:importabcclassAbstractClass:def__init__(self):pass@abc.abstractmethoddefrun(self,*args,**kw):pass然后其派生类实现抽象类中定义的抽象方法,以及顺序这里是相反的。父类中的逻辑其实是确定的,只是在真正执行的时候调用传入的子类实例来实现。为了更好地说明,让我们看一个例子:):pet=self.petprint('Pet\'snameis{}'.format(pet))print('Itsays:{}!'.format(pet.speak()))classDog(object):defspeak(self):return'woof'def__str__(self):return'dog'classCat(object):defspeak(self):return'meow'def__str__(self):return'cat'if__name__=='__main__':pet=PetCollection(狗)pet.show_pet()在这个例子中,Dog和Cat是子类,PetCollection是父类。我们可以发现speak方法也是在父类中实现的,只不过是通过调用子类的speak来实现的。也就是说,任何具有speak类的子类都可以用来创建PetCollection。这个PetCollection相当于一个抽象的通用类,这样我们在使用的时候就可以通过它来集成很多逻辑,简化操作。第一次看到这种设计模式的时候,觉得很普通,不过就是把类作为参数而已。但是再读一遍,又有了新的认识。这不也是抽象类的反向使用吗?其实代码的核心只是逻辑,所谓的设计模式只是前人总结的经验。真正有价值的不是这种模式下代码怎么写,而是核心逻辑。这些综合起来之后,以后设计自己的模式就不难了。本文转载自微信公众号「TechFlow」,可通过以下二维码关注。转载请联系TechFlow公众号。