设计模式——把类作为参数的抽象工厂模式
今天给大家介绍一个非常简单的设计模式,一学就会,非常好用。
这个模式叫做抽象工厂模式,大家可能对工厂模式比较熟悉,在工厂模式当中封装了实例的创建逻辑。主要的用途一般是将一些复杂的类的创建过程整合在一起,通过参数控制,这样使用者可以较简单地获得实例。
抽象工厂
抽象工厂模式和工厂模式类似,只不过更加抽象了一层。在创建实例的时候,不是通过参数来控制,而是直接传入想要创建的类。这一点其实也是Python的特性,一切皆是对象,一切皆可传参,类本身也是一个对象,类也是可以传参的。所以我们可以把一个类直接传入工厂,工厂通过类来创建实例。
我们来用代码简单演示一下:
class AbstractFactory:
def __init__(self, cls):
self.cls = cls
def build(self, *args, **kw):
return self.cls(*args, **kw)
这段代码大家都能看懂,但是这其实也不能完全叫做抽象工厂,因为体现不出来抽象。这里的抽象主要是把工厂当做了一个更高阶的抽象类,有点像是抽象类的反向使用。
我们一般使用抽象类都是这样:
import abc
class 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相当于一个抽象的通用类,这样我们在使用的时候可以用它来集成很多逻辑,简化操作。
我第一次看这个设计模式的时候,觉得普普通通,不过是把类当做参数而已。但是之后又看了一次,又有了新的理解,这不也是抽象类的反向使用吗?其实代码的核心就只有逻辑,所谓的设计模式也不过是前人总结出的经验而已。真正有价值的并不是这个模式当中的代码怎么写,而是核心的逻辑,这些融会贯通了,以后也不难设计出我们自己的模式来。
今天的文章就到这里,衷心祝愿大家每天都有所收获。如果还喜欢今天的内容的话,不要忘了三连。
原文发表于公众号TechFlow,求个关注
{{uploading-image-465998.png(uploading...)}}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
2020-03-09 LeetCode37 使用回溯算法实现解数独,详解剪枝优化