2009-12-17 101 views

回答

4

请参阅wikipedia。取决于“返回接口的实现”的意思,是的。但是这个定义可能不是很准确/全面(特别是因为Factory模式不一定需要接口的概念)。

4

出自百科:

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

+0

如果我们在谈论f我会不同意这个定义。工厂本身可以实现一个接口(IFactory),但它不是一个接口,也没有定义接口。工厂实现也会实例化类本身,而不是推迟到一个子类。 – 2009-12-17 20:12:57

+1

我认为这个术语是“接口”的一般定义,而不是语言结构“接口”的实际概念 – rossipedia 2009-12-17 20:18:23

2

从本质上说,是

然而,根据您的语言,“接口”可以具有特定意义的工厂通常会返回一个具体实施总承包的 - 。这可以是接口,基类或任何其他专业化手段。另外,有些时候工厂会返回您指定的确切类型 - 但是您为另一个目的而使用工厂,例如管理生命期,跟踪或除了构造特定类型之外的其他一些基本原理。

+0

+!为了清晰和简洁 – 2009-12-17 21:35:36

2

夫妇这更重要的资源:

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

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

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

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(); 
    } 
    
  • 返回单一实例(虽然难吃,你最好确定它是线程安全的!)

+0

或者* pre * - 构造初始化 - 类似于由几个类共享的静态类inits,或者仅仅不适合被实例化的类。 – Roboprog 2010-03-13 16:43:47