这里写的更详细,术语描述的更准确:
https://blog.csdn.net/qq_27825451/article/details/84235974
这里是个人粗浅的理解加上一些比喻!
第一次看到工厂模式时硬是没有理解,导致往后看到它都绕着走,但无意间看到了别人写的代码,突然恍然大悟,工厂模式并不复杂,也是一套模板!~~
它究竟是解决什么问题的呢?(个人有限的看法)
某一大类中有很多很多类,如大类food里有苹果,梨,香蕉等等类,如果这个版本只要求上苹果,创建对象时就可以用new来写,但如果下个版本又要添加梨,香蕉,再下个版本又要添加橘子,榴莲等等,难道要一直new吗?到最后也不知道经过多少开发之手了,代码完全乱套,这种情况就可以用工厂模式统一管理,统一分配!
注意工厂模式是用来创建对象的!
一共三种工厂模式,依次是:简单工厂模式 >>> 工厂方法(函数)模式 >>> 抽象工厂模式
先看简单工厂模式。
还是以food为例。
正常情况下,我们只需要一个水果时,只要new
下
class apple:
def __init__(self):
print('苹果')
ap = apple()
结果:
苹果
但如果水果多的话就要换种思考方法了。
#### 水果种类
class Pea:
def __init__(self):
print('Pea')
class Kale:
def __init__(self):
print('Kale')
class Celery:
def __init__(self):
print('Celery')
#### 食物工厂
class FoodFactory:
def create_factory(self, name):
if name == 'Pea':
return Pea()
elif name == 'Kale':
return Kale()
elif name == 'Celery':
return Celery()
else:
return None
先从水果种类开始看,首先是定义了水果类,有Pea,Kale,Celery,我觉得这些就相当于工厂里的机器
,可以加工特定的水果。
FoodFactory就相当于大型厂房
,里面装有上面的机器,给厂房发布命令,具体的机器开始运作加工水果。
if __name__ == '__main__':
pea = FoodFactory().create_factory('Pea')
Kale = FoodFactory().create_factory("Kale")
Celery = FoodFactory().create_factory("Celery")
你看我们在创建水果类时是用工厂类创建的,不是直接new出来的,这还有一个好处是隐藏“创建逻辑”。
创建逻辑
是什么鬼?
简单理解就是指我必须要知道创建函数的构造函数的逻辑组成,才能创建对象。
总结:如果要创建一系列复杂的对象,需要提供很多的创建信息;或者是我想要隐藏创建对象时候的“代码逻辑”,就需要使用“工厂模式”
但是呢,大佬们写代码追求优秀,要遵守开闭原则,就是对扩展开放,对修改关闭,就是新增代码可以有,但修改以前的代码坚决不要。
(我刚开始理解时认为新增和修改不是一回事吗,到后来才明白,新增是在不修改原有代码的基础上新增代码,修改的意思是修改以前写好的代码,注意这2个地方是有前提的——有已经写好的一部分代码)
简单工厂模式就违背了开闭原则,试想,当要求再新增一个水果时,必要要修改工厂类中的if语句,这就不是优秀代码了。
所以,有大佬就对着屏幕思考啊思考,终于思考出简单工厂模式的升级版 工厂方法(函数)模式
。