栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

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

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

本文主要通过榨汁机和果汁的例子,讲解简单工厂模式及其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个版本:

    简单工厂模式工厂方法模式抽象工厂模式

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/767411.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号