.net 工厂模式问题

.net 工厂模式问题,.net,design-patterns,.net,Design Patterns,我第一次尝试使用工厂法。似乎有两种方法可以做到这一点,但我不确定何时使用哪种方法(或者其中一种方法是否错误?) 1) 创建具有被子类重写的方法的抽象类: public abstract class EmployeeCreator { public abstract Employee FactoryMethod(); } public class DeveloperCreator : EmployeeCreator { public override Employee Facto

我第一次尝试使用工厂法。似乎有两种方法可以做到这一点,但我不确定何时使用哪种方法(或者其中一种方法是否错误?)

1) 创建具有被子类重写的方法的抽象类:

public abstract class EmployeeCreator
{
    public abstract Employee FactoryMethod();
}

public class DeveloperCreator : EmployeeCreator
{
    public override Employee FactoryMethod()
    {
        return new Developer();
    }
}
2) 创建一个包含一个工厂方法的类:

public class EmployeeFactory
{
    public static Employee CreateEmployee(EmployeeType type)
    {
        if (type == EmployeeType.Developer)
            return new Developer();
        else
            return new Secretary();
    }
}
在我的例子中#2似乎要容易得多,因为我不必创建所有这些“creator”子类,这些子类除了返回正确类型的员工之外没有什么作用

但是它仍然使用工厂模式吗?

您的第一个案例是模式,而第二个案例是模式。这是两种不同的模式,都是有效和有用的。(实际上没有“工厂模式”——每当你听到这个术语时,它都是指上述模式之一。)

如果您只需要创建一个产品,工厂方法通常是更好的选择。如果你有(任何机会)需要创建一系列相关产品,你需要抽象工厂。如果需要将工厂注入到代码中的不同位置,后者也会更好,因为为此最好有一个不同的接口。

第一种情况是模式,第二种情况是模式。这是两种不同的模式,都是有效和有用的。(实际上没有“工厂模式”——每当你听到这个术语时,它都是指上述模式之一。)


如果您只需要创建一个产品,工厂方法通常是更好的选择。如果你有(任何机会)需要创建一系列相关产品,你需要抽象工厂。如果您需要将工厂注入到代码中的不同位置,后者也会更好,因为为此最好有一个不同的接口。

老实说,我不确定哪种方式是“正确的”,但我可以告诉您,正如您所说的,您的第二种选择在您的场景中会更有用。如果可能的话,我尝试在抽象基类中使用静态创建方法,以便根据必要的逻辑实例化正确的子类。听起来你也在努力这么做,我看不出有什么问题


请记住,设计模式可作为解决问题的指南,并通过标准化帮助可维护性。如果你发现一些东西能保持同样的“精神”,但由于某些明显的原因更适合你的需要,我看没有理由不去做。

我真的不确定哪种方式是“正确的”,但我可以告诉你,你的第二种选择将在你的场景中更有用,正如你所说的那样。如果可能的话,我尝试在抽象基类中使用静态创建方法,以便根据必要的逻辑实例化正确的子类。听起来你也在努力这么做,我看不出有什么问题


请记住,设计模式可作为解决问题的指南,并通过标准化帮助可维护性。如果你发现某种东西能保持同样的“精神”,但由于某种明显的原因更适合你的需要,我看没有理由不去做。

100%同意,就你的情况而言,你应该去做案例二。根据Head First Design Patterns一书,第一个不是简单工厂的例子,第二个不是工厂的例子吗?抽象工厂是为产品系列服务的,不是吗?@Joe,在你的第一个例子中,这个系列只有一个成员,仅此而已。我想这不应该有一个单独的名字。您仍然有抽象的基类/接口和单独的具体工厂子类,这是模式的要点。是的,我现在确实看到了第一个是一个抽象工厂。100%同意,对于你的案例,你应该选择案例二。根据Head first设计模式书,第一个不是简单工厂的例子,第二个不是工厂?抽象工厂是为产品系列服务的,不是吗?@Joe,在你的第一个例子中,这个系列只有一个成员,仅此而已。我想这不应该有一个单独的名字。您仍然有抽象的基类/接口和单独的具体工厂子类,这是模式的要点。是的,我现在确实看到第一个是一个抽象工厂。谢谢。你说你在抽象基类中创建了工厂方法(在我的例子中是Employee)?我想我也会这么做,因为为一个工厂方法创建一个类似乎毫无意义。您通常如何称呼您的方法,例如EmployeeFactory、CreateEmployee、GetEmployee…?@Joe通常与CreateEmployee类似,但使用符合您的代码标准和约定的方法。谢谢。你说你在抽象基类中创建了工厂方法(在我的例子中是Employee)?我想我也会这么做,因为为一个工厂方法创建一个类似乎毫无意义。您通常如何调用您的方法,例如EmployeeFactory、CreateEmployee、GetEmployee…?@Joe通常与CreateEmployee类似,但使用符合您的代码标准和约定的方法。