设计模式名称:从类获取类

2024-05-16 07:44:52 发布

您现在位置:Python中文网/ 问答频道 /正文

特别是在单元测试中,我们使用这种“设计模式”,我称之为“从类级别获取类”

在框架测试.py公司名称:

class FrameWorkHttpClient(object):
    ....

class FrameWorkTestCase(unittest.TestCase):

    # Subclass can control the class which gets used in get_response()
    HttpClient=FrameWorkHttpClient  

    def get_response(self, url):
        client=self.HttpClient()
        return client.get(url)

在我的测试.py公司名称:

^{pr2}$

方法get_response()self获取类,而不是通过导入它。这样子类可以修改类并使用不同的HttpClient。在

这个(从类级别获取类)“设计模式”的名称是什么?在

这是“控制反转”还是“依赖注入”?在


Tags: pyself名称client框架urlgetresponse
3条回答

您的代码与Factory method pattern非常相似。唯一的区别是您的变量使用工厂类变量而不是工厂方法。在

我并不完全是一个设计模式的“大师”,但对我来说,它看起来有点像模板方法模式。您正在基类中定义get_response方法的“骨架”,并将一个步骤(定义要使用的类)留给子类。在

如果这可以被认为是模板模式,这是一个控制反转的例子。在

我相信这与使用Python特定语法实现的简单多态性具有相同的目的。不是让虚拟方法返回新实例,而是将实例类型存储为类/子类中的“可重写变量”。在

这可以重写为一个虚拟方法(抱歉,我不太精通Python,所以这只是伪代码)

virtual HttpClient GetClient()
  return new FrameworkHttpClient()

然后在子类中,更改方法的实现以返回不同的类型:

^{pr2}$

如果你想称之为模式,我会说它类似于Strategy GoF pattern。在您的特定案例中,被抽象出来的算法是特定HttpClient实现的创建。在

再想一想——正如你所说,这确实可以看作是国际奥委会的一个例子。在

相关问题 更多 >