概念
在面向对象中,工厂表示一个负责创建其他类型对象的类。
工厂具有:
- 松耦合
- 客户端无需了解创建对象的类,但是照样可以使用它来创建对象。
- 可以轻松的在工厂中添加其他类来创建其他类型的对象。
工厂模式有3种变体:
- 简单工厂:允许接口创建对象,但不会暴露对象的创建逻辑。
- 工厂方法:允许接口创建对象,但使用哪个类来创建对象是交给子类决定。
- 抽象工厂:抽象工厂是一个能够创建一系列相关对象而无需指定其具体类的接口。它可以提供其他工厂的对象,在内部创建其他对象。
实现
简单工厂
- 工厂根据传入的参数,返回或者创建不同的对象
# ABCMeta是Python的特殊的元类,用来生成抽象类
from abc import ABCMeta, abstractmethod
# 动物类,定义say方法,但不实现
class Animal(metaclass=ABCMeta):
@abstractmethod
def say(self):
pass
# 狗类,继承动物,重写say方法
class Dog(Animal):
def say(self):
print('i am dog')
# 猫类,继承动物,重写say方法
class Cat(Animal):
def say(self):
print('i am cat')
# 工厂类
class ForestFactory(object):
# say方法的统一接口,传入子类对象,调用他们的say方法
def say_something(self, object_type):
return eval(object_type)().say()
if __name__ == '__main__':
ff = ForestFactory()
animal = 'Cat'
ff.say_something(animal)
'''结果
i am cat'''
工厂方法
- 定义一个接口来创建对象,工厂本身并不创建对象,而交给子类完成,子类决定要实例化哪些类。
- Factory方法的创建时通过继承而不是通过实例化。
- 工厂方法更加具有可定制性,它可以返回相同的实例或者子类,而不是某种类型的对象。
假设每个页面都有一块区域显示个人信息,但是内容不同,设计代码如下:
from abc import ABCMeta, abstractmethod
# 一个区表示哪方面内容,抽象的
class Section(metaclass=ABCMeta):
@abstractmethod
d