用工厂名称调用方法-最佳实践解决方案是什么

时间:2018-08-02 19:17:34

标签: c# oop

我想为家庭自动化项目找到最佳的设计解决方案。

我有以下实体:

//Switch light on/off
ISwitchable
{
    Switch()
}  

IDevice
{
}

Lamp : IDevice, ISwitchable
{
    Switch()
}

如果我收到用户的输入以打开灯,我想调用以下命令: Lamp.Switch(...) 开关是字符串输入。

我将使用工厂方法来选择特定的设备(灯),但是特定的功能呢?

什么是调用欲望方法的最佳实践解决方案(如果存在)。 反思是必经之路,还是我可以不使用反思而思考设计? 谢谢!

1 个答案:

答案 0 :(得分:0)

我认为您正在寻找带有strategy patternabstract factory来制定策略。

您描述的每个不同的“操作”都是一种策略。所有这些策略都必须实现相同的接口(可能是采用设备参数的称为Do / Invoke / Execute之类的方法)。

为抽象工厂提供了指示所需策略的信息,并返回了该策略的具体实现(通常通过switch)。

以一个示例为例,您将有一个由类实现的“打开”策略,并且在该策略的方法中,如果给定的设备合适(例如,如果它是ISwitchable),则可以在该方法上调用该方法。像这样的设备:

ISwitchable switchable=device as ISwitchable;
if (switchable!=null)
{
    switchable.Switch();
}

在这一点上,您可以看到问题中的ISwitchable接口没有用,因为您正在尝试打开某项操作,但是它所需要使用的只是一种可以切换开关的方法(设备可能已经打开了)。但我相信您可以解决这些细节。请记住,不同的操作可能需要设备来实现其他接口。

我认为问题中的IDevice接口是多余的-只需使用object。当然是most interfaces with no members are worthless。每个设备实现哪个操作接口,就足够了。