我的程序有两个课程;两者都派生自同一个基类。
class A : MyBase
{
internal A(InitVal initVal)
}
class B : MyBase
{
internal B(InitVal initVal)
}
InitVal
是另一个通过构造函数注入的类。此类供内部使用。由于内部构造函数,用户无法直接创建类的A
实例B
。相反,我创建了创建这些对象的方法。
class Initiator
{
InitVal initVal;
public T CreateObject<T>(ObjectInstance objectInstance) where T : MyBase
{
MyBase myBase = null;
switch(objectInstance)
{
case ObjectInstance.A:
myBase = new A(initVal);
break;
case ObjectInstance.B:
myBase = new B(initVal);
break;
}
return (T)myBase;
}
...
}
ObjectInstance
是上面代码中的枚举。
这可以毫无问题地工作,但我相信您之前从未见过如此丑陋的代码。
请建议我应该使用的创作模式。我想删除ObjectInstance
枚举而不改变功能。它会清理很多。
我尝试了dotfactory上提到的创建模式。
在这种情况下看起来不合适。Factory Method
Abstract Factory
我的代码虽然看起来很丑,但阅读和理解起来非常简单。我尝试实现上述增加代码复杂性的模式。所以这也是我选择答案的标准。
Initiator
除了类,我无法更改代码中的任何内容。我无法访问所有其他类进行编辑。
编辑1:为什么上面的代码在我看来很难看
1) 在调用CreateObject
方法时,用户必须两次指定对象的类型。
A a = initiator.CreateObject<A>(ObjectInstance.A);
首先是T
通用值,其次是枚举值。我想避免这种情况。
2) 由于用户必须两次指定对象类型,因此有出错的机会。
A a = initiator.CreateObject<A>(ObjectInstance.B);
在上面的代码中,枚举值和通用值是不同的。这是不允许的,这将是一个问题。使用我的代码,我无法避免这种情况。
这就是为什么; 我正在寻找适合我的情况而又不增加复杂性的模式。
如果我以某种方式消除枚举的必要性,代码会好得多。如果我可以将签名更改CreateObject
为以下,那会好得多。
public T CreateObject<T>() where T : MyBase
但是,我不确定我将如何实现此方法来创建适当的实例。