“取决于抽象而不是具体”。所以我像第1部分一样编写代码。当我想使用ElfBlackSmith时,我会编写“ BlackSmith elf = new ElfBlackSmith()”。问题是,无论何时我想要一个新的ElfBlackSmith,都需要创建一个新的相同对象。 ElfBlackSmith似乎可以是单身。而且在Playframework之类的框架中,它可以像第2部分一样完成。
第1部分满足DIP,但似乎有些浪费;
part2是直接的,它遵循Java版本的更改,该更改使方法变为静态但不满足DIP并使其难以更改;
或者,在我看来,将工厂放置在part1的ElfBlackSmith中使其成为单例,因此part1可以满足这两个条件。但是我还没有看到任何这样的代码。
简而言之,有三种方法,哪一种更好?
第1部分:
Interface BlackSmith{ int make(); }
class ElfBlackSmith implements BlackSmith{ int make( return 1;)}
class OrcBlackSmith implements BlackSmith{ int make( return 2;)}
第2部分:
class ElfBlackSmith { static int make( return 1;)}
class OrcBlackSmith { static int make( return 2;)}
第3部分:
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();
答案 0 :(得分:1)
我看不到存在冲突。
那些仅仅是两个独立的概念。 Dependency Inversion 指导您如何设计代码,以避免依赖方向错误,例如,需要启用适当的代码重用。
另一方面,Singleton完全独立于此:它简单地说:某些“事物”只有一个实例。
因此,这里没有“更好”的地方。从这个角度来看,您的问题类似于:“哪个更好,绿色还是苹果?”