4

工厂是否只返回接口的实现?那是工作吗?

4

5 回答 5

14

有时这就是工厂所做的一切,但他们也可以:

  • 根据仅在运行时可用的数据选择具体实现:

    // 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();
    }
    
  • 返回一个单例实例(虽然很糟糕,你最好确保它是线程安全的!)

于 2009-12-17T20:14:29.973 回答
4

参见维基百科。取决于您所说的“返回接口的实现”的确切含义,是的。但是这个定义可能不是很准确/全面(特别是因为工厂模式不一定需要接口的概念)。

于 2009-12-17T20:03:42.280 回答
4

来自维基:

工厂模式的本质是“定义一个用于创建对象的接口,但让子类决定实例化哪个类。工厂方法让一个类将实例化推迟到子类。

于 2009-12-17T20:05:27.970 回答
2

本质上,是的。

但是,根据您的语言,“界面”可能具有特定含义。工厂通常返回通用合同的具体实现——可以是接口、基类或任何其他专业化方式。

此外,有时工厂返回您指定的确切类型 - 但您将工厂用于其他目的,例如管理生命周期、跟踪或其他一些基本原理,而不是构造专用类型。

于 2009-12-17T20:06:43.750 回答
2

在这方面有更多很棒的资源:

更具体的答案是,工厂是为常见的对象类型提供预初始化和预构造工作。最简单的例子(我见过)是“锤子工厂”,其中锤子由两个物体(手柄和头部)构成,并被赋予一个单一的名称“木柄羊角锤”。因此,我们的工厂可以有一个方法:

(Hammer|IHammer|...) GetHammer(string hammername);

它可以返回几个对象之一(实际的 Hammer 对象、描述 Hammer 的接口、Hammer 的基类等)。其中最有用的可能是返回一个描述锤子的接口,并允许我们从那里实现许多有用的设计模式。

于 2009-12-17T20:10:25.363 回答