繁体   English   中英

试图理解 Python 中的抽象工厂模式

[英]trying to make sense of abstract factory pattern in Python

我在 Python 中找到了这个抽象工厂模式的例子。 我试图弄清楚为什么需要一个 DogFactory,难道只是调用 Dog 类的代码更少吗,有人可以解释一下这种模式在现实世界的应用程序中将如何有用

class Dog:

    def speak(self):
        return "Woof!"

    def __str__(self):
        return "Dog"


class DogFactory:

    def get_pet(self):
        return Dog()

    def get_food(self):
        return "Dog Food!"


class PetStore:

    def __init__(self, pet_factory=None):

        self._pet_factory = pet_factory


    def show_pet(self):

        pet = self._pet_factory.get_pet()
        pet_food = self._pet_factory.get_food()

        print("Our pet is '{}'!".format(pet))
        print("Our pet says hello by '{}'".format(pet.speak()))
        print("Its food is '{}'!".format(pet_food))

factory = DogFactory()

shop = PetStore(factory)

shop.show_pet()

抽象工厂模式有两个主要好处:

1)解耦客户端代码

抽象工厂模式的重点是将客户端(在本例中为PetStore )与其创建的具体类(在本例中为Dog )解耦。

想象一下你有一个不同的宠物家庭 - 例如猫。 使用抽象工厂模式,您可以创建一个不同的工厂来生产Cat对象。 这里的关键见解是两个工厂共享相同的接口 - 即get_pet()get_food()

class Cat:
    def speak(self): return "Meow!"
    def __str__(self): return "Cat"

class CatFactory:
    def get_pet(self): return Cat()
    def get_food(self): return "Cat Food!"

现在,由于工厂之间的通用接口,您只需要一行代码就可以让客户端对猫而不是狗进行操作:

factory = CatFactory()

PetStore类本身不需要更改。

2) 强制相关类家族之间的关系

您可能会争辩说, DogFactory传入DogFactoryCatFactory ,为什么不传入DogCat呢? 这就是您的示例代码未能展示抽象工厂模式强大之处的地方。 当整个系列的相关类组合在一起时,这种模式真的很闪耀。 在您的示例中,只有狗本身和狗粮。 但是想象一下你还有一张狗床、一个狗项圈、一个狗玩具等。如果是这种情况,而且你没有使用抽象工厂模式,那么你可能会写这样的代码:

pet = Dog()
food = DogFood()
bed = DogBed()
collar = DogCollar()
toy = DogToy()

shop = PetStore(pet, food, bed, collar, toy)

此代码冗长且不灵活。 还有一种危险是,您可能会不小心将带有狗产品的猫玩具传入。

相反,使用 AbstractFactory,代码变得微不足道,并且类家族之间的关系被强制执行:

factory = DogFactory()
shop = PetStore(factory)  # PetStore calls get_*(), and is guaranteed
                          # to only get dog products

使用抽象工厂模式,您可以生成特定工厂接口的实现,每个实现都知道如何创建不同类型的 dog()。 抽象工厂的方法被实现为工厂方法。 抽象工厂模式和工厂方法模式都通过抽象类型和工厂将客户端系统与实际实现类分离。

请参阅这些参考链接:-

  1. http://www.dofactory.com/net/abstract-factory-design-pattern#_self2
  2. 工厂模式和抽象工厂模式之间的基本区别是什么?

我知道另一个网站有更好的解释,许多不同的编程语言中的示例代码包括Python。

https://refactoring.guru/design-patterns/abstract-factory/python/example#lang-features

玩得开心!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM