如何解决是一个返回抽象类的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
中,属性已移出 CraneInterface
,add_on_changed_callback
的 CraneInterface
方法将不再起作用。>
所以为了解决这个问题,CraneInterface
有一个抽象属性来返回一个抽象的 AxisInterface
类(如 AnimalFactory2
示例)。 AxisInterface
然后拥有带有自定义设置器的可观察属性(以及添加观察者的方法),以便 CraneInterface
的用户可以向数据添加观察者。
我知道“observable”部分是观察者模式的一个例子,但是延迟返回的 Axis 实现类型是工厂模式的一个例子吗?
谢谢。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。