简单工厂模式适用于产品较少的场景,一旦产品频繁增加,就需要修改创建产品的接口,这样做违背了开闭原则。工厂方法模式针对这种情形做了改造,相比于简单工厂模式,增加了抽象工厂这个角色。
在工厂方法模式里,工厂有多个,每个工厂负责生产一个类的产品,客户端代码需要指定由哪个工厂来生产产品。在简单工厂模式里,工厂只有一个,客户端通过传入不同的参数来得到对应的产品,这是两者之间最大的不同。
from abc import ABC, abstractmethod
class Fruit(ABC):
def __init__(self, name):
self.name = name
@abstractmethod
def make_juice(self):
pass
class Apple(Fruit):
def make_juice(self):
print(f"制作{self.name}汁")
class Grape(Fruit):
def make_juice(self):
print(f"制作{self.name}酒")
class AbcFruitFactory(ABC):
@abstractmethod
def create_fruit(self):
pass
class AppleFactory(AbcFruitFactory):
def create_fruit(self):
return Apple('苹果')
class OrangeFactory(AbcFruitFactory):
def create_fruit(self):
return Grape('葡萄')
fruit1 = AppleFactory().create_fruit()
fruit1.make_juice() # 制作苹果汁
fruit2 = OrangeFactory().create_fruit()
fruit2.make_juice() # 制作葡萄酒
在理解设计模式的时候,千万不要用下面的这种思维方式来理解它:我这样做,或者这样写代码也能实现相同的代码效果呀,这个设计模式有什么好处?
就比如上面的例子,直接创建Apple类的实例对象它不香么,何必绕这么大一圈呢?你有此疑问,说明你还没有参与过大型项目,没有被千头万绪的业务关系搞晕过,没有被几十上百个类的定义和实例创建困扰过。当然,我也没有,我在学习设计模式时也总希望有人能够用生动具体的例子解释使用设计模式有什么好处,但是很遗憾,没人写出那样的技术文章。究其根本,那样复杂的场景适合使用设计模式,但不适合写文章,单单给你介绍业务背景就需要几万字了。
理解设计模式,我建议你更多的去关系它是什么,就拿这个工厂方法来说,它这样做,就是竭力避免你自己主动的去创建产品类的实例。你看到的这些产品类都很简单,很容易就创建了,但如果某一个产品类的实例创建非常复杂,要传入数十个参数,这些参数获取的过程也比较麻烦以至于即便给了你这个类的定义,你也不知道如何创建它的实例,那么这种情况下,工厂方法模式就可以解救你了。
你不需要关系那些参数是怎么一回事,你只需要找到对应的工厂,调用工厂的创建产品的方法即可。
这种设计模式的目标,就是把产品对象实例的创建过程隐藏起来,不让你知道,不让你自己去创建,你非要说你也能创建,写出的代码比设计模式更简单,那就是你的无知了,因为你还没有遇到过一个类,一个你不知道如何为它创建对象实例的类。
QQ交流群: 211426309