工厂模式是一种最常用的创建型设计模式。
详解可以参考http://www.runoob.com/design-pattern/abstract-factory-pattern.html下的一条笔记,很是生动形象。
1. 了解工厂模式
术语“工厂”表示一个负责创建其它类型对象的类。通常情况下,作为一个工厂的类有一个对象以及与它关联的多个方法。客户端使用某些参数调用此方法,之后,工厂据此创建所需类型的对象,将它返回给客户端。工厂具有以下优点:
- 松耦合,即对象的创建可以独立于类的实现
- 客户端无需了解创建对象的类,依旧可以使用它来创建对象
- 可以轻松在工厂中添加其它类来创建其它类型的对象,而无需更改客户端代码
- 工厂可以重用现有对象,如果是客户端直接创建对象的话,总是会创建一个新的对象
ps:个人理解,工厂即用来管理许多的类,客户端想要哪个类,工厂便根据参数返回哪个类的对象
Factory模式有3种变体:
- 简单工厂模式:允许接口创建对象,但不会暴露对象的创建逻辑
- 工厂方法模式:允许接口创建对象,但使用哪个类来创建对象,则是交由子类决定
- 抽象工厂模式:创建一系列相关对象而无需指定/公开其具体类的接口,该模式能够提供其它工厂的对象,在其内部创建其它对象。
2. 简单工厂模式
如图是简单工厂的UML图,这里,客户端使用的是Factory类,该类具有create_type()方法。当客户端使用类型参数调用create_type()方法时,Factory会根据传入的参数,返回Product1或Product2。
在下面的代码中,将创建一个名为Animal的抽象产品,Animal是一个抽象的基类(ABSMeta是Python的特殊元类,用来生成类Abstract),它带有方法do_say()。我们利用Animal接口创建了两种产品(Cat和Dog),并实现了do_say()方法来提供这些动物相应的叫声。ForestFactory是一个带有make_sound()方法的工厂。根据客户端传递的参数类型,它就可以在运行时创建适当的Aniaml实例。
from abc import ABCMeta, abstractmethod
class Animal(metaclass=ABCMeta):
@abstractmethod
def do_say(self):
pass
class Dog(Animal):
def do_say(self):
print('Bhow Bhow !!')
class Cat(Animal):
def do_say(self):
print('Meow Meow !!')
# forest factory defined
class ForestFactory(object):
def make_sound(self, object_type):
return eval(object_type)().do_say()
# client code
if __name__ == '__main__':
ff = ForestFactory()
animal = input('Which animal should make_sound Dog or Cat?')
ff.make_sound(animal)