设计模式的名称:从类级别获取类

gue*_*tli 7 python inheritance design-patterns dependency-injection inversion-of-control

特别是在单元测试中,我们使用这种"设计模式",我称之为"从班级获取课程"

framworktest.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)
Run Code Online (Sandbox Code Playgroud)

mytest.py:

class MyHttpClient(FrameWorkHttpClient):
    ....

class MyTestCase(FrameWorkTestCase):
    HttpClient=MyHttpClient

    def test_something(self):
        response=self.get_response()
        ...
Run Code Online (Sandbox Code Playgroud)

该方法不是通过导入来get_response()获取类self.这样子类可以修改类并使用不同的类HttpClient.

这个名称是什么(从班级获得类)"设计模式"?

这是"控制反转"还是"依赖注入"?

ren*_*kiy 5

您的代码与Factory方法模式非常相似.唯一的区别是您的变体使用工厂类变量而不是工厂方法.


Mar*_*rek 4

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

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

virtual HttpClient GetClient()
  return new FrameworkHttpClient()
Run Code Online (Sandbox Code Playgroud)

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

override HttpClient GetClient()
  return new MyHttpClient()
Run Code Online (Sandbox Code Playgroud)

如果你想称其为模式,我会说它类似于策略 GoF 模式。在您的特定情况下,被抽象的算法是创建特定的 HttpClient 实现。

经过再三思考 - 正如你所说,这确实可以被视为一个 IoC 示例。