工厂方法模式(Simple Factory Pattern)
定义一个用于创建对象的接口,让子类决定将哪一个类实例化,让一个类的实例化延迟到其子类。
工厂方法模式何时用
需要动态创建同一基类的不同对象时使用。
工厂方法模式好处
- 实现了对象创建和使用的分离;
- 如何创建这个对象的细节则完全封装在具体工厂内部;
- 在系统中加入新产品时,完全符合开闭原则。
工厂方法模式缺陷
- 系统中类的个数将成对增加,在一定程度上增加了系统的复杂度;
- 会给系统带来一些额外的开销,增加了系统的抽象性和理解难度。
工厂方法模式的代码实现
业务需求
有一个汽车厂商生产两种车辆,根据用户需求提供不同的车型。用户刚好有两种需求对应这两种车型:
- 需求:只买贵的,不买对的
- 需求:经济、安全、实用
设计思路
- 定义一个名为Car的基类,土豪车CarA和普通车CarB别继承自基类Car;
- 工厂基类类CarFactory提供一个名为GetCar接口;
- 土豪车CarA和普通车CarB的工厂分别实现基类的GetCar接口,返回具体的车辆。
代码实现
为了实现上述需求,代码如下:
# -*- coding: utf-8 -*-
class Car: # 定义基类
def __init__(self):
self.speed = 0
def run(self):
print('Speed: ' + str(self.speed))
class CarA(Car): # 土豪车
def __init__(self):
self.speed = 200
print('I am rich. I can run faster.')
class CarB(Car): # 普通车
def __init__(self):
self.speed = 100
print('I am normal. I can run.')
class CarFactory: # 汽车工厂基类
def get_car(self): # 工厂方法接口(工厂方法模式的工厂方法应该就是指这个方法)
pass
class CarAFactory(CarFactory):
def get_car(self): # 土豪车 实现工厂方法接口
return CarA()
class CarBFactory(CarFactory):
def get_car(self): # 普通车 实现工厂方法接口
return CarB()
if __name__ == '__main__':
factoryA = CarAFactory()
factoryB = CarBFactory()
a = factoryA.get_car()
a.run()
b = factoryB.get_car()
b.run()
结语
此时,如果要新增一种“屌丝车CarC”,则不用修改上述代码中的任何类,只需要按现有接口新增一套就行。解决了简单工厂不符合“开闭原则”的问题。下一篇会介绍抽象工厂模式的相关内容,请继续关注。