使用工厂模式的主要含义是什么?
class FanFactory : IFanFactory
{
public IFan CreateFan(FanType type)
{
switch (type)
{
case FanType.TableFan:
return new TableFan();
case FanType.CeilingFan:
return new CeilingFan();
case FanType.ExhaustFan:
return new ExhaustFan();
default:
return new TableFan();
}
}
}
尽管它违反了SOLID原理,但似乎合乎逻辑。使用一个工厂对象,我可以创建其他任何对象。
static void Main(string[] args)
{
IFanFactory fanFactory = new PropellerFanFactory();
IFan fan = fanFactory.CreateFan();
fan.SwitchOn();
Console.ReadLine();
}
在这种情况下,我也可以这样做:
IFan fan = new PropellerFan();
fan.SwitchOn();
工厂方法的目的是什么?您看不到其中的代码简化。如果我们在类中使用继承,而在子级中使用继承,则在父级中添加其他方法,那么一切都会失去意义。
答案 0 :(得分:3)
工厂模式允许:
例如:
public YourClass(IYourDependency dep) { }
然后您可以使用工厂创建依赖项:
var dep = new FanFactory.CreateFan(...)// An example of IoC
var cl = new YourClass(dep);
然后您可以在单元测试中模拟依赖项:
var dep = new Mock<IYourDependency>().Object;
var cl= new YourClass(dep);
答案 1 :(得分:3)
您是对的,因为工厂静态地绑定到其实例化的类型,所以工厂本身会破坏OPEN / CLOSED原理。在抽象工厂中也会发生同样的情况,因为您仅引入了更高级别的抽象。不是由工厂决定要创建的类型,而是由创建工厂的代码决定。
但是实际上您必须在某处执行切换。该代码可能会破坏一些原则。这是您在编程中经常要做的一个权衡。但是,这被认为是低价以获得更高的收益:不必在引入新类型的任何地方更改每个客户代码,而只需在工厂内执行一次即可。因此,所有消费者代码都可以保持不变。
另一个优点是您的客户端代码完全不了解实际的类。它不需要知道它。实际上,实际的类甚至可以是任意的模拟。这样,即使依赖项(实现HISTCONTROL=ignoredups
的实际类)尚不存在或仅由另一个团队成员部分开发,您也可以测试客户端代码:
IFan