简单工厂模式(Simple Factory Pattern)
工厂模式是一个用来创建对象的设计模式。
简单工厂模式何时用
需要动态创建同一基类的不同对象时使用。
简单工厂模式好处
- 实现了对象创建和使用的分离;
- 客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可。
简单工厂模式缺陷
- 由于工厂类集中了所有产品的创建逻辑,职责过重,一旦不能正常工作,整个系统都要受到影响;
- 一旦添加新产品就不得不修改工厂逻辑,违反了开闭原则。
简单工厂模式的代码实现
业务需求
有一个汽车厂商生产两种车辆,根据用户需求提供不同的车型。用户刚好有两种需求对应这两种车型:
- 需求:只买贵的,不买对的
- 需求:经济、安全、实用
设计思路
- 定义一个名为Car的基类,土豪车CarA和普通车CarB别继承自基类Car;
- 工厂类CarFactory提供一个名为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, kind):
if kind == 'expensive': # 贵的则生产 土豪车
return CarA()
if kind == 'normal': # 一般的生产 普通车
return CarB()
if __name__ == '__main__':
# 业务逻辑中已经不生产具体的车辆了,实现了解耦
factory = CarFactory()
b = factory.get_car('normal')
b.run()
a = factory.get_car('expensive')
a.run()
结语
工厂模式有三兄弟,本文中的简单工厂模式是其中的小弟,除此之外还有工厂方法模式与抽象工厂模式两位大佬。简单工厂模式中存在的缺陷,会在另两中模式中得到解决,请关注我后续的文章。