gdb*_*dbj 7 c# design-patterns factory-pattern
我有一个工厂对象ChallengeManager
来Challenge
为我正在构建的游戏生成一个对象的实例.有很多挑战.每个Challenge
类派生的构造函数是不同的,但是它们之间有一个共同的接口,在基类中定义.
当我调用时manager.CreateChallenge()
,它返回一个实例Challenge
,它是派生类型之一.
理想情况下,我想在派生类本身内保留对象构造的代码,因此与该对象相关的所有代码都是共存的.例:
class Challenge {}
class ChallengeA : Challenge {
public static Challenge MakeChallenge() {
return new ChallengeA();
}
}
class ChallengeB : Challenge {
public static Challenge MakeChallenge() {
return new ChallengeB();
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我的ChallengeManager.CreateChallenge()
通话只需要决定要呼叫的课程MakeChallenge()
.构造的实现包含在类本身中.
使用此范例,每个派生类都必须定义静态MakeChallenge()
方法.但是,由于该方法是静态的,我不能在这里使用接口,需要它.
这不是什么大问题,因为我可以很容易地记住为每个派生类添加正确的方法签名.但是,我想知道是否应该考虑更优雅的设计.
Eri*_*ert 22
我非常喜欢你描述的模式并经常使用它.我喜欢这样做的方式是:
abstract class Challenge
{
private Challenge() {}
private class ChallengeA : Challenge
{
public ChallengeA() { ... }
}
private class ChallengeB : Challenge
{
public ChallengeB() { ... }
}
public static Challenge MakeA()
{
return new ChallengeA();
}
public static Challenge MakeB()
{
return new ChallengeB();
}
}
Run Code Online (Sandbox Code Playgroud)
这种模式有很多不错的属性.没有人可以创新,Challenge
因为它是抽象的.没有人可以创建派生类,因为Challenge
默认的ctor是私有的.没有人可以得到ChallengeA
或ChallengeB
因为他们是私人的.您定义了接口Challenge
,这是客户端需要理解的唯一接口.
当客户想要一个A
,他们要求Challenge
一个,他们得到它.他们不需要担心幕后的事实A
是由实现的ChallengeA
.他们只是得到了Challenge
他们可以使用的东西.
归档时间: |
|
查看次数: |
6173 次 |
最近记录: |