工厂是否只返回接口的实现?那是工作吗?
5 回答
有时这就是工厂所做的一切,但他们也可以:
根据仅在运行时可用的数据选择具体实现:
// 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(); }
返回一个单例实例(虽然很糟糕,你最好确保它是线程安全的!)
参见维基百科。取决于您所说的“返回接口的实现”的确切含义,是的。但是这个定义可能不是很准确/全面(特别是因为工厂模式不一定需要接口的概念)。
来自维基:
工厂模式的本质是“定义一个用于创建对象的接口,但让子类决定实例化哪个类。工厂方法让一个类将实例化推迟到子类。
本质上,是的。
但是,根据您的语言,“界面”可能具有特定含义。工厂通常返回通用合同的具体实现——可以是接口、基类或任何其他专业化方式。
此外,有时工厂返回您指定的确切类型 - 但您将工厂用于其他目的,例如管理生命周期、跟踪或其他一些基本原理,而不是构造专用类型。
在这方面有更多很棒的资源:
更具体的答案是,工厂是为常见的对象类型提供预初始化和预构造工作。最简单的例子(我见过)是“锤子工厂”,其中锤子由两个物体(手柄和头部)构成,并被赋予一个单一的名称“木柄羊角锤”。因此,我们的工厂可以有一个方法:
(Hammer|IHammer|...) GetHammer(string hammername);
它可以返回几个对象之一(实际的 Hammer 对象、描述 Hammer 的接口、Hammer 的基类等)。其中最有用的可能是返回一个描述锤子的接口,并允许我们从那里实现许多有用的设计模式。