Один из вариантов наверняка - поместить метод Load
в интерфейс, а остальные реализовать в другие классы.Это позволит вам всегда вызывать его из класса Game
, но в то же время каждый экземпляр будет предоставлять свою собственную реализацию.
Интерфейс будет таким простым:
public interface ILoader {
void Load();
}
Здесь вы вводите две строки, которые могут понадобиться вашему загрузчику.
public class Loader1 : ILoader {
public string prop1 { get; set; }
public string prop2 { get; set; }
public Loader1(string param1, string param2) {
prop1 = param1;
prop2 = param2;
}
public void Load() {
// Use prop1 and prop2
}
}
И в этом случае вы вводите какой-то другой объект.
public class Loader2 : ILoader {
public SomeObject prop1 { get; set; }
public Loader2(SomeObject param1) {
prop1 = param1;
}
public void Load() {
// Use prop1
}
}
Прелесть этого в том, что каждый загрузчик получитсвои собственные параметры через конструктор, но игра всегда будет вызывать метод Load
одинаково.Если вам нужна фабрика, то сделайте это, но вы всегда можете использовать общий инжектор зависимостей, например, Unity, как вы упомянули.
Внедрение параметров в конструкторы возможно с большинством контейнеров внедрения зависимостей.Точно так же, как @Thierry прокомментировал в своем ответе, вы можете сделать это с помощью Unity.Если, с другой стороны, вы предпочитаете перейти на другую платформу, которая немного упрощает (основанную на мнении), вы можете, например, попробовать Ninject.В этом случае вы просто выполните что-то вроде этого:
Bind<ILoader>().To<FileLoader>().WithConstructorArgument("file.txt");
В любом случае, я думаю, что дизайн более чем хорош.