, как говорит DIP, «зависит от абстракций, а не от конкреций».поэтому я кодирую как часть1.Когда я хочу использовать ElfBlackSmith, я пишу «BlackSmith elf = new ElfBlackSmith ()». Проблема в том, что когда я хочу новый ElfBlackSmith, мне нужно создать новый объект.И кажется, что ElfBlackSmith может быть синглтоном.А в некоторых средах, таких как Playframework, это можно сделать как part2.
part1 удовлетворяет DIP, но кажется, что есть некоторая трата;
part2 является прямой и следует за изменением версии java, которая делает методы статичными, но нене удовлетворяет DIP и затрудняет его изменение;
Или, по моему мнению, создайте фабрику в ElfBlackSmith части 1, чтобы сделать ее синглтоном, и, таким образом, часть 1 удовлетворяет обеим требованиям.Но я не видел никого подобного кода.Короче говоря, есть три способа, и какой из них лучше?
part1:
Interface BlackSmith{ int make(); }
class ElfBlackSmith implements BlackSmith{ int make( return 1;)}
class OrcBlackSmith implements BlackSmith{ int make( return 2;)}
part2:
class ElfBlackSmith { static int make( return 1;)}
class OrcBlackSmith { static int make( return 2;)}
part3:
Interface BlackSmith{ int make();}
class ElfBlackSmith{
private static final ElfBlackSmith INSTANCE = new ElfBlackSmith();
public static ElfBlackSmith getInstance(){return INSTANCE;}
int make( return 1;)
}
использование части 1:
BlackSmith elf = new ElfBlackSmith();
elf.make();
использование части 2:
ElfBlackSmith.make();
использование части 3:
BlackSmith elf = ElfBlackSmith.getInstance();
elf.make();