工厂模式。什么时候使用工厂方法?

时间:2020-03-05 18:55:16  来源:igfitidea点击:

什么时候在对象而不是Factory类中使用工厂方法是一个好主意?

解决方案

回答

这真的是一个品味问题。可以根据需要对工厂类进行抽象/接口处理,而工厂方法的重量较轻(并且由于没有定义的类型,因此也易于测试),但它们需要类似于服务的众所周知的注册点定位器,但用于定位工厂方法)。

回答

当工厂类返回的对象类型具有私有构造函数,不同的工厂类在返回的对象上设置不同的属性或者特定的工厂类型与其返回的具体类型结合在一起时,工厂类非常有用。

WCF使用ServiceHostFactory类在不同情况下检索ServiceHost对象。 IIS使用标准的ServiceHostFactory检索.svc文件的ServiceHost实例,但是WebScriptServiceHostFactory用于将序列化返回给JavaScript客户端的服务。 ADO.NET数据服务具有其自己的特殊DataServiceHostFactory,而ASP.NET具有其ApplicationServicesHostFactory,因为其服务具有私有构造函数。

如果只有一个消耗工厂的类,则可以在该类中使用工厂方法。

回答

工厂类比较重,但是可以给我们带来一定的优势。在需要从多个原始数据源构建对象的情况下,它们允许我们仅将构建逻辑(以及数据的聚合)封装在一个地方。在那里,可以抽象地测试它,而无需考虑对象接口。

我发现这是一个有用的模式,特别是在我无法替换ORM并使其不足的情况下,并且想要有效地实例化DB表联接或者存储过程中的许多对象。

回答

当我们需要多个具有相同参数类型但行为不同的"构造函数"时,它们也很有用。

回答

多数情况下,当构造函数的表现力不足时,应将工厂方法视为构造函数的替代方法。

class Foo{
  public Foo(bool withBar);
}

表现力不如:

class Foo{
  public static Foo withBar();
  public static Foo withoutBar();
}

当我们需要复杂的过程来构造对象时,当构造需要我们不希望为实际类创建的依赖项,需要构造其他对象等时,工厂类非常有用。

回答

我喜欢以我的班级为"人"来思考设计模式,而模式是人们彼此交谈的方式。

因此,对我而言,工厂模式就像一家中介公司。我们有一个需要可变数量工人的人。这个人可能知道他们所雇用的人需要的一些信息,仅此而已。

因此,当他们需要新员工时,他们会致电招聘机构并告诉他们他们需要什么。现在,要真正雇用某人,我们需要了解很多东西福利,资格验证等。但是,雇用人并不需要知道任何事情,而是由雇用机构来处理所有这些。

同样,使用Factory可使使用者创建新对象而不必知道如何创建它们的详细信息,也不必知道它们的依赖关系,而只需要提供实际所需的信息即可。

public interface IThingFactory
{
    Thing GetThing(string theString);
}

public class ThingFactory : IThingFactory
{
    public Thing GetThing(string theString)
    {
        return new Thing(theString, firstDependency, secondDependency);
    }
}

因此,现在ThingFactory的使用者可以获取Thing,而不必了解Thing的依赖关系,除了来自使用者的字符串数据。