本文主要通过榨汁机和果汁的例子,讲解简单工厂模式及其Python代码实现。
工厂模式设计思想
在日常生活中,我们通过榨汁机榨汁,加入不同的水果就产生不同的果汁,例如苹果汁,橙汁等。这一过程就如同一个工厂一样,我们加入不同的原料,就会生产出不同的产品,这就是程序设计中工厂模式的概念。
工厂模式中有两个最基础的概念:
- 工厂类:专门负责创建其他类的实例,根据参数的不同创建不同类的实例(当然,符合此概念的也可以是一个静态方法),例子中的榨汁机就是一个工厂类。
- 产品类:被工厂类创建的对象的类称为产品类,例子中的苹果汁,橙汁都是产品类。
简单工厂模式的代码实现
了解了简单工厂模式的设计思想,接下来我们使用Python对例子中讲解到概念进行实现。
首先,我们定义了一个产品类的抽象类:
# 引入 ABCMeta 和 abstractmethod来定义抽象类和抽象方法
from abc import ABCMeta, abstractmethod
class FruitJuice(metaclass=ABCMeta):
"""果汁"""
def __init__(self, name):
self.__name = name
def get_name(self):
return self.__name
@abstractmethod
def get_juice(self):
pass
可以看到这个果汁类除了 __init__
方法之外,只定义了2个方法:
get_name
: 用于返回参数name
;get_juice
: 这个方法用于获取“果汁”,但是没有实现任何功能,并且使用@abstractmethod
装饰器进行装饰,这样的目的是保证其子类必须自己实现该方法。
接下来,我们分别定义“苹果汁”类和“橙汁”类:
class AppleJuice(FruitJuice):
"""苹果汁"""
def __init_(self, name):
super().__init__(name)
def get_juice(self):
return "苹果汁"
class OrangeJuice(FruitJuice):
"""橙汁"""
def __init_(self, name):
super().__init__(name)
def get_juice(self):
return "橙汁"
可以看到这两个产品子类都自己实现了 get_juice
方法,返回了具体的果汁。
最后,我们需要定义产品类——“榨汁机”类:
class Juicer:
"""榨汁机"""
@staticmethod
def make_juice(fruit):
if fruit == "苹果":
fruit_juice = AppleJuice(fruit)
elif fruit == "橙子":
fruit_juice = OrangeJuice(fruit)
else:
raise ValueError("不支持的参数: %s" % fruit)
return fruit_juice
我们放入不同的“水果”给“榨汁机”,“榨汁机”就会实例化并返回相应的产品类,这就是“榨汁机”的作用。
下面我们简单测试一下代码。
放入苹果给榨汁机,榨汁机返回苹果汁:
放入橙子给榨汁机,榨汁机返回橙汁:
小结
以上就是最简单的工厂模式,所以称为简单工厂模式,而实际上工厂模式这种编程思想衍生出来了3个版本:
- 简单工厂模式
- 工厂方法模式
- 抽象工厂模式
本文只介绍了简单工厂模式,想要了解其他更为复杂的工厂模式的可以参考《人人都懂设计模式》-罗伟富。