IDC

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

作者:admin 2021-08-20 我要评论

今天给大家介绍一个非常简单的设计模式,一学就会,非常好用。 这个模式叫做抽象工厂模式,大家可能对工厂模式比较熟悉,在工厂模式当中封装了实例的创建逻辑。...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

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

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

抽象工厂

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

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

  1. class AbstractFactory: 
  2.     def __init__(self, cls): 
  3.         self.cls = cls 
  4.          
  5.     def build(self, *args, **kw): 
  6.         return self.cls(*args, **kw) 

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

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

  1. import abc 
  2.  
  3. class AbstractClass: 
  4.     def __init__(self): 
  5.         pass 
  6.      
  7.     @abc.abstractmethod 
  8.     def run(self, *args, **kw): 
  9.         pass 

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

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

  1. class PetCollection(object): 
  2.  
  3.     def __init__(self, animal): 
  4.         self.pet_generator = animal 
  5.         self.pet = self.pet_generator() 
  6.      
  7.     def speak(self): 
  8.         self.pet.speak() 
  9.  
  10.     def show_pet(self): 
  11.         pet = self.pet 
  12.         print('Pet\'s name is {}'.format(pet)) 
  13.         print('It says: {}!'.format(pet.speak())) 
  14.  
  15.  
  16. class Dog(object): 
  17.     def speak(self): 
  18.         return 'woof' 
  19.  
  20.     def __str__(self): 
  21.         return 'dog' 
  22.  
  23.  
  24. class Cat(object): 
  25.     def speak(self): 
  26.         return 'meow' 
  27.  
  28.     def __str__(self): 
  29.         return 'cat' 
  30.  
  31. if __name__ == '__main__'
  32.     pet = PetCollection(Dog) 
  33.     pet.show_pet() 

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

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

本文转载自微信公众号「TechFlow」,可以通过以下二维码关注。转载本文请联系TechFlow公众号。


本文转载自网络,原文链接:https://mp.weixin.qq.com/s/ClDzK2FRPjtarPR-Lo3YTw

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • 设计模式——把类作为参数的抽象工厂模

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

  • 如果世界上只有前端和后端开发,我应该

    如果世界上只有前端和后端开发,我应该

  • 5分钟完全掌握Python协程

    5分钟完全掌握Python协程

  • 浅析数据结构栈和队列的相互实现

    浅析数据结构栈和队列的相互实现

腾讯云代理商
海外云服务器