工厂是否只返回接口的实现? 这是工作吗?
答案 0 :(得分:13)
有时这是工厂所做的一切,但他们也可以:
根据仅在运行时提供的数据选择具体实现:
// Beverage Factory
public IBeverage CreateBeverage(DateTime orderDate) {
return orderDate.Hour > 12 ? new Beer() : new Milk();
}
执行构造后初始化(通常是昂贵的初始化或初始化不适合封装在对象本身内的数据):
// Weather report factory
public IWeatherReport CreateWeatherReport() {
WeatherReport report = new WeatherReport();
report.data = WeatherWebService.GetData();
return report;
}
根据现有实例初始化新实例:
// Fittest Algorithm Factory
public Algorithm CreateNewAlgorithm() {
return this.fittestAlgorithm.Clone();
}
从池中绘制实例,而不是从头创建一个实例:
public IDbConnection CreateConnection(string connectionString) {
return this.ConnectionStacks[connectionString].Pop();
}
返回一个单例实例(虽然很糟糕,你最好确保它是线程安全的!)
答案 1 :(得分:4)
见wikipedia。根据“返回接口的实现”的具体含义,是的。但是这个定义可能不是非常准确/全面(特别是因为Factory模式不一定需要接口的概念)。
答案 2 :(得分:4)
来自维基:
工厂模式的本质是“定义用于创建对象的接口,但让子类决定实例化哪个类.Plant方法允许类将实例化延迟到子类。
答案 3 :(得分:2)
实质上,是的。
但是,根据您的语言,“界面”可能具有特定含义。工厂通常返回一般合同的具体实现 - 可以是接口,基类或任何其他专业化方法。
此外,有时工厂会返回您指定的确切类型 - 但您将工厂用于其他目的,例如管理生命周期,跟踪或除构建专用类型之外的其他一些原理。
答案 4 :(得分:2)
在此上结合更多优秀资源:
更具体的答案是工厂要为常见的对象类型提供预初始化和预构建工作。最简单的例子(我已经看到)是一个“锤子工厂”,锤子由两个物体(手柄和头部)构成,并给出一个名称“木柄爪锤”。因此,我们的工厂可以有一个方法:
(Hammer|IHammer|...) GetHammer(string hammername);
可以返回多个对象中的一个(实际的Hammer对象,描述Hammer的接口,Hammer的Base类等)。可能最有用的是返回描述锤子的界面,并允许我们从那里实现许多有用的设计模式。