I have a factory object ChallengeManager
to generate instances of a Challenge
object for a game I'm building. There are many challenges. The constructors for each Challenge
class derivation are different, however there is a common interface among them, defined in the base class.
When I call manager.CreateChallenge()
, it returns an instance of Challenge
, which is one of the derived types.
Ideally, I would like to keep the code for the object construction inside the derived class itself, so all the code related to that object is co-located. Example:
class Challenge {}
class ChallengeA : Challenge {
public static Challenge MakeChallenge() {
return new ChallengeA();
}
}
class ChallengeB : Challenge {
public static Challenge MakeChallenge() {
return new ChallengeB();
}
}
Now, my ChallengeManager.CreateChallenge()
call only needs to decide the class to call MakeChallenge()
on. The implementation of the construction is contained by the class itself.
Using this paradigm, every derived class must define a static MakeChallenge()
method. However, since the method is a static one, I am not able to make use of an Interface here, requiring it.
It's not a big deal, since I can easily remember to add the correct method signature to each derived class. However, I am wondering if there is a more elegant design I should consider.
ChallengeManager.CreateChallenge()
? and; if you already know the class to instantiate, why can't you just instantiate it inCreateChallange
method? – CopepodCreateChallenge
. IfCreateChallenge
gets too long for your taste, extract methods from it to make the intention more clear. If it's really long, extract it into its own class. YMMV – Creolacreole