python设计模式之简单工厂模式

1. 简单工厂模式概念

简单工厂模式通过接口来创建对象,根据传入的参数不同返回不同的类的实例,这样做的目的是隐藏对象创建时的逻辑。在具体实现上,有3个角色需要定义:

  1. 工厂角色, 它是简单工厂模式的核心,工厂类提供一个创建实例对象的方法,根据传入参数不同,返回不同的类的实例。
  2. 抽象产品角色, 这个角色是相对于具体产品角色而言的,它是所有具体产品角色类的基类
  3. 具体产品角色, 这些类继承抽象产品类,具体的业务代码都要放在这里来实现。

抽象产品类要定义抽象方法,具体产品类必须实现抽象方法,对于工厂模式的使用方来说,他们不必关心实例对象如何创建。

简单工厂模式实现

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 FruitFactory():
    @classmethod
    def create_fruit(cls, name):
        if name == 'apple':
            return Apple('苹果')
        elif name == 'grape':
            return Grape("葡萄")


fruit1 = FruitFactory.create_fruit('apple')
fruit1.make_juice()

fruit2 = FruitFactory.create_fruit('grape')
fruit2.make_juice()
  1. FruitFactory 就是工厂角色,专门负责生产产品
  2. Fruit 是抽象产品角色,代码里不会创建它的实例对象
  3. Apple 和 Grape 是具体产品角色,Fruit是他们的父类,具体产品角色必须实现make_juice方法

现在,我们来思考一个问题,当新增一种水果种类时,代码需要做哪些改动呢?就以Orange为例,你必须新增一个Orange类,这个类继承Fruit类,接下来,需要修改FruitFactory的create_fruit方法,当name为的值是orange时返回Orange的示例对象。

简单工厂模式的优点在于降低开发人员对实例对象创建的理解成本,值需要向接口里传入特定的实参就可以获得自己想要的实例对象。

简单工厂模式的缺点也十分明显,当具体产品角色非常多时,维护工厂角色就会变得繁琐困难,因此简单工厂模式更适合具体产品角色较少的场景。

扫描关注, 与我技术互动

QQ交流群: 211426309

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案