【发布时间】:2016-04-27 10:42:21
【问题描述】:
我正在使用以下factory pattern:
using System;
class Program
{
abstract class Position
{
public abstract string Title { get; }
}
class Manager : Position
{
public override string Title
{
get
{
return "Manager";
}
}
}
class Clerk : Position
{
public override string Title
{
get
{
return "Clerk";
}
}
}
class Programmer : Position
{
public override string Title
{
get
{
return "Programmer";
}
}
}
static class Factory
{
/// <summary>
/// Decides which class to instantiate.
/// </summary>
public static Position Get(int id)
{
switch (id)
{
case 0:
return new Manager();
case 1:
case 2:
return new Clerk();
case 3:
default:
return new Programmer();
}
}
使用这种模式的方法在同一来源的示例中:
static void Main()
{
for (int i = 0; i <= 3; i++)
{
var position = Factory.Get(i);
Console.WriteLine("Where id = {0}, position = {1} ", i, position.Title);
}
}
如果我的派生类为其构造函数使用不同数量的参数,我应该使用这种模式吗?
我可能需要进行的修改是在实例化工厂时:
var position = Factory.Get(i);
我可能需要为所有派生类传入参数,无论它们是否会使用它们:
var position = Factory.Get(i, param1, param2, param3);
需要修改switch语句:
public static Position Get(int id, param1, param2, param3) //HERE IS THE MODIFIED PARAM LIST
{
switch (id)
{
case 0:
return new Manager(param1); //MODIFIED
case 1:
case 2:
return new Clerk(param2, param3); //MODIFIED
case 3:
default:
return new Programmer(param3); //MODIFIED
}
}
我对工厂模式所做的修改是否会破坏该模式,我是否应该使用不同的模式来创建对象?
【问题讨论】:
-
您能否提供更多有关
Get方法使用者的背景信息?它是如何获取参数值的? -
在我看来像是一个反模式。如果您需要知道创建站点的参数,则您已经需要知道 ID 的含义,因此您无法从调用单个工厂方法中获得任何好处。如果每个构造函数的参数不同,会发生什么?您将拥有三组独立的参数,全部传递给
Get()?这看起来很糟糕。 -
构造函数中参数的数量并不重要。这只是初始化类的方便。有些类有很多构造函数,而另一些则没有(或基类的默认值)。
-
工厂的客户不应该知道 Products 的依赖关系。这意味着工厂不应该考虑“如何创建对象”,而只考虑“创建哪个对象”。如果这不符合您的需求,您应该查看 Builder 模式。
-
@jdweng 谢谢。你能举一个例子,说明类如何在工厂模式的上下文中从基类中获取默认构造函数?
标签: c# .net visual-studio design-patterns factory-pattern