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

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

[[358276]]

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

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

抽象工厂

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

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

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

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

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

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

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

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

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() 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.

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

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

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

 

责任编辑:武晓燕 来源: TechFlow
相关推荐

2021-03-06 22:50:58

设计模式抽象

2020-10-19 09:28:00

抽象工厂模式

2021-09-29 13:53:17

抽象工厂模式

2009-01-15 10:55:29

JavaScript设计模式抽象工厂

2011-07-28 09:50:58

设计模式

2024-09-14 08:24:44

设计模式抽象工厂模式JDK

2024-03-06 13:19:19

工厂模式Python函数

2020-08-21 07:23:50

工厂模式设计

2022-01-12 13:33:25

工厂模式设计

2011-11-17 16:03:05

Java工厂模式Clojure

2023-08-07 06:30:15

抽象工厂模式软件设计模式

2020-09-14 17:26:48

抽象工厂模式

2024-07-31 08:12:33

2021-07-06 08:59:18

抽象工厂模式

2010-04-19 09:30:00

工厂模式PHP设计模式

2022-05-09 08:04:50

工厂模式设计模式

2013-11-26 16:29:22

Android设计模式

2010-10-09 09:25:35

Python工厂模式

2015-11-03 09:43:43

avascript设计模式工厂模式

2019-08-16 10:46:46

JavaScript工厂模式抽象工厂模式
点赞
收藏

51CTO技术栈公众号