【设计模式】喝一杯果汁,学会简单工厂模式

本文主要通过榨汁机和果汁的例子,讲解简单工厂模式及其Python代码实现。

工厂模式设计思想

在日常生活中,我们通过榨汁机榨汁,加入不同的水果就产生不同的果汁,例如苹果汁,橙汁等。这一过程就如同一个工厂一样,我们加入不同的原料,就会生产出不同的产品,这就是程序设计中工厂模式的概念。

工厂模式中有两个最基础的概念:

  1. 工厂类:专门负责创建其他类的实例,根据参数的不同创建不同类的实例(当然,符合此概念的也可以是一个静态方法),例子中的榨汁机就是一个工厂类。
  2. 产品类:被工厂类创建的对象的类称为产品类,例子中的苹果汁,橙汁都是产品类。

简单工厂模式的代码实现

了解了简单工厂模式的设计思想,接下来我们使用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个版本:

  1. 简单工厂模式
  2. 工厂方法模式
  3. 抽象工厂模式

本文只介绍了简单工厂模式,想要了解其他更为复杂的工厂模式的可以参考《人人都懂设计模式》-罗伟富

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值