微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

是一个返回抽象类的python`抽象属性`,是工厂模式的一个例子

如何解决是一个返回抽象类的python`抽象属性`,是工厂模式的一个例子

我需要记录我的设计,特别是使用的设计模式,并希望使用标准术语。

Refactoring Guru 开始,“工厂方法定义了一个方法,该方法应该用于创建对象,而不是直接调用构造函数。子类可以覆盖此方法以更改将要创建的对象的类”。

我有一个带有抽象方法CraneInterface 类,并且此方法的签名强制其返回类型是 AxisInterface 的实现。本质上,CraneInterface 的子类“覆盖此方法以更改将要创建的对象的类”。与我的版本的唯一区别是它不一定“创建一个新实例,它也可以返回一个已经存在的实例。这还是工厂模式吗?如果没有,这种设计模式是否有一个通用名称

即:传统工厂如下所示:

class IAnimal(ABC):
    @abstractmethod
    def speak(self):
        pass

class Dog(IAnimal):
    #overide
    def speak(self):
        print('Woof')

class Cat(IAnimal):
    #overide
    def speak(self):
        print('Meow')
    
class AnimalFactory(ABC):
    @abstractmethod
    def make_animal(self) -> IAnimal:
        pass

class CatFactory(AnimalFactory):
    #overide
    def make_animal(self) -> IAnimal:
        return Cat()

class DogFactory(AnimalFactory):
    #overide
    def make_animal(self) -> IAnimal:
        return Dog()

我的代码看起来更像这样:

class AnimalFactory2(ABC):
    @property
    @abstractmethod
    def animal(self) -> IAnimal:
        pass

class CatFactory2(AnimalFactory2):

    def __init__(self):
        self.__cat = Cat()

    #overide
    @property
    def animal(self) -> IAnimal:
        return self.__cat

class DogFactory2(AnimalFactory2):

    def __init__(self):
        self.__dog = Dog()    
    
    #overide
    @property
    def animal(self) -> IAnimal:
        return self.__dog

第二个例子是否使用了工厂模式?它是否有不同的名称,甚至根本没有名称?主要区别在于它不会在每次调用时都创建一个新实例。

额外信息:

在我的实际代码中,我有一个 3 轴 CraneInterface 类,它具有与起重机交互的所有方式的抽象方法。它由一个 Cranesimulator一个 CraneOpcuaClient 实现,它们实际上与真正的起重机对话。模拟器的原始设计在 Cranesimulator 类内部实现了抽象方法,但是,这有很多重复的代码,因为起重机的每个功能都对 3 个轴中的每个轴重复。为了解决这个问题,我创建了一个 AxisSimulation 类,它有与之交互的方法,然后在 Cranesimulator 中有 3 个实例化,CraneInterface 抽象方法的实现只是简单地转发请求 3 个轴对象之一。

问题在于,CraneInterface 还需要能够在起重机状态发生变化(例如位置或温度变化)时通知“观察者”。即 CraneInterface 需要具有函数 add_on_x_position_changed_callback(self,callback: Callable[[Position],None])。为此,CraneInterface 具有带有自定义 setter 的属性,只要设置了值,就会通知观察者列表。通过将 AxisSimulation 放在 Cranesimulator 中,属性已移出 CraneInterfaceadd_on_changed_callbackCraneInterface 方法将不再起作用。>

所以为了解决这个问题,CraneInterface一个抽象属性来返回一个抽象的 AxisInterface 类(如 AnimalFactory2 示例)。 AxisInterface 然后拥有带有自定义设置器的可观察属性(以及添加观察者的方法),以便 CraneInterface用户可以向数据添加观察者。

我知道“observable”部分是观察者模式的一个例子,但是延迟返回的 Axis 实现类型是工厂模式的一个例子吗?

谢谢。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。