【发布时间】:2010-09-12 07:58:59
【问题描述】:
考虑这个例子
界面
interface IBusinessRules
{
string Perform();
}
继承者
class Client1BusinessRules: IBusinessRules
{
public string Perform()
{
return "Business rule for Client 1 Performed";
}
}
class Client2BusinessRules: IBusinessRules
{
public string Perform()
{
return "Business rule for Client 2 Performed";
}
}
class Client3BusinessRules: IBusinessRules
{
public string Perform()
{
return "Business rule for Client 3 Performed";
}
}
工厂类
class BusinessRulesFactory
{
public IBusinessRules GetObject(int clientIdentityCode)
{
IBusinessRules objbase = null;
switch (clientIdentityCode)
{
case 1:
objbase = new Client1BusinessRules();
break;
case 2:
objbase = new Client2BusinessRules();
break;
case 3:
objbase = new Client3BusinessRules();
break;
default:
throw new Exception("Unknown Object");
}
return objbase;
}
}
示例用法:
class Program
{
static void Main(string[] args)
{
BusinessRulesFactory objfactory = new BusinessRulesFactory ();
IBusinessRulesFactory objBase = objfactory.GetObject(2);
Console.WriteLine(objBase.Perform());
objBase = objfactory.GetObject(3);
Console.WriteLine(objBase.Perform());
Console.Read();
}
}
我的问题是,如何在 ALgorithm1 类上添加另一个方法 但不在界面中,因为我只会在特殊情况下使用它?
class Client1BusinessRules: IBusinessRules
{
public string Perform()
{
return "Client1 Business rules is Performed";
}
public string Calculate()
{
return "Additional functionality for CLient1";
}
}
我应该如何在 UI 上这样称呼它
objBase = objfactory.GetObject(1);
Console.WriteLine(objBase.Calculate());
还有其他解决办法吗?提前致谢
编辑:我重写它以类似于我当前的项目设计
【问题讨论】:
-
我没有把工厂和开关盒结合起来......如果你必须“决定”,工厂到底有什么用?
-
是的,系统将根据clientIdentityCode(每个客户端都有唯一的身份代码)决定执行什么方法,所以我必须使用switch case来评估代码
-
如果使用switch case就不需要Factory,Factory Pattern的整个设计都是基于“不知道”的概念。如果 ClientBusinessRules 类的数量增加,您也必须更新开关/案例。恕我直言,您的设计需要重新考虑。不要仅仅为了它而使用模式。
-
在您的情况下,如果您将开关盒移动到“静态 void Main”,您的所有问题都将得到解决,忘记所有接口并明确地在那里做您想要的。或者多研究一下工厂模式;)
-
我的系统有很多客户。我不想为每个客户创建项目的副本。我只需要将每个客户的业务规则分成不同的类,甚至是 dll。,。最好使用哪种设计模式?
标签: c# design-patterns architecture interface factory-pattern