using System; using System.Reflection; namespace FactoryMethodExample { class Program { static void Main(string[] args) { Patrix patrix = new Patrix(); patrix.LoadScene("HalfPaper"); patrix.LoadScene("Matrix"); } } class Patrix { private PatrixSceneFactory GetGameScene(string gameSceneName) { return (PatrixSceneFactory)Assembly.Load("FactoryMethodExample").CreateInstance("FactoryMethodExample." + gameSceneName + "Factory"); } public void LoadScene(string gameSceneName) { PatrixSceneFactory psf = GetGameScene(gameSceneName); PatrixScene ps = psf.CreateScene(); ps.InitScene(); } } abstract class PatrixSceneFactory { public abstract PatrixScene CreateScene(); } abstract class PatrixScene { public void InitScene() { Texture texture = CreateTexture(); Model model = CreateModel(); model.FillTexture(texture); } public abstract Model CreateModel(); public abstract Texture CreateTexture(); } abstract class Model { public abstract void FillTexture(Texture texture); } abstract class Texture { } class HalfPaperFactory : PatrixSceneFactory { public override PatrixScene CreateScene() { return new HalfPaper(); } } class HalfPaper : PatrixScene { public HalfPaper() { Console.WriteLine("HalfPaper Creating"); } public override Model CreateModel() { return new HalfPaperModel();