如何理解DIP和单例之间的冲突?

时间:2019-02-18 07:56:01

标签: java design-patterns

正如DIP所说,

“取决于抽象而不是具体”。所以我像第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();

1 个答案:

答案 0 :(得分:1)

我看不到存在冲突

那些仅仅是两个独立的概念。 Dependency Inversion 指导您如何设计代码,以避免依赖方向错误,例如,需要启用适当的代码重用。

另一方面,Singleton完全独立于此:它简单地说:某些“事物”只有一个实例。

因此,这里没有“更好”的地方。从这个角度来看,您的问题类似于:“哪个更好,绿色还是苹果?”