1

我正在编写一个库,我想以一种潜在用户发现它易于使用该库的方式来构建我的代码。我看过这个很棒的 AP​​I 设计视频。黄金法则之一是拥有良好的设计模式。我有两个想法。外观设计模式和工厂设计模式。这两种设计模式都用于在程序代码中实现高度抽象,以供用户使用。

我发现申请哪一个或两者都申请是如此困难。当然,我想避免使用反模式。

我使用的语言是 Python,它与上面提供的视频链接中强调的 Java 完全不同。我的图书馆将如何运作:

Character class
Window class

可以创建许多角色对象。

假设我要使用外观设计模式,我将在外观构造函数中初始化这两个类,以便可以在方法中调用它们:

门面类():

    __init__(self):

    self.character = Character()

    self.window = Window()

在这里,我将创建表示在字符和窗口类中创建的方法的方法。然后用户可以轻松调用这些:

Facade = Facade()
Facade.methodUsedInCharacterClass()
Facade.methodUsedInCharacterClass()
Facade.methodUsedInWindowClass()

但在这里我看到外观有问题,你可以有两个不同的角色,你会想做不同的事情。你可以这样做:

Facade = Facade()
badguy= Facade.methodUsedInCharacterClass()
goodguy= Facade.methodUsedInCharacterClass()
Facade.methodUsedInWindowClass()

然后,您不能使用 badguy 或 goodguy 变量来调用其他行为,例如

badguy.rotate()
goodguy.jump()

这是不允许的,但有没有办法做到这一点?

此外,由于构造函数正在调用类,因此可以使用工厂方法,它在运行时根据我自己的理解选择要执行的类。我只能想象,但在这种情况下,它将如何应用?

谢谢!

4

1 回答 1

1

您似乎误解了工厂和外观模式的目的。

工厂模式用于构建事物。所以你会有一个CharacterFactory和一个WindowFactory。如果客户需要特殊字符,他们需要一种方法来CharacterFactory用他们的默认值替换您的默认值。

字符工厂应该能够生成不同类型的字符。这样,您可以为您的游戏构建默认的好人和坏人。然后客户可以覆盖这些方法来修改默认值。

外观用于使对象看起来好像它是不同类型的。所以你的窗口可能有一个类型的孩子View。然后, ACharacterView将是一个外观,它将来自角色的信息映射到View界面的数据中,然后窗口可以使用该界面来显示诸如健康之类的信息,而无需了解有关角色或健康的任何信息。

这意味着您还需要一个包含默认工厂的配置对象。客户从ConfigFactory.

class ConfigFactory:
    def createConfig(self):
        config = Config()
        config.characterFactory = self.createCharacterFactory()
        return config

    def createCharacterFactory(self):
        return CharacterFactory()

客户将覆盖它以获得自己的工厂:

class CustomConfigFactory(ConfigFactory):
    def createCharacterFactory(self):
        return CustomCharacterFactory()
于 2013-11-13T16:09:57.743 回答