2016-04-27 4 views

答えて

3

クラスを「オープン」にするには、クラスを継承する必要があります。継承は「is-a」関係です。シングルトンクラスから継承した場合、子クラスのインスタンスも "is-a"関係のため親クラスのインスタンスになります。つまり、突然シングルトンクラスのインスタンスを複数持つことができます。

シングルトンクラスが継承を禁止する場合は、もはや「オープン」ではありません。

シングルトンクラスは継承でき、そして拡張のための「オープン」であるならば、それはもはやシングルトンパターンを強制することはできません。

1

Singletonパターンには二つの問題があります。

  • は他がそれに強い依存関係を持っていながら、シングルトンクラス自体は、そのインスタンスの作成を制御しているので、それは開放/閉鎖原則を破ります。これにより、アプリケーション全体で徹底的な変更を行うことなく、実装を別のもので変更することができなくなります。
  • これは、コンシューマが常にインスタンスを取得するためにコンクリートクラスに依存するため、依存性の逆転原理を破りますが、DIPでは抽象化に依存する必要があると述べています。これにより、シングルトン実装がドラッグされ、実装をデコレータにラップするか、シングルトン実装なしでクライアントを配布することで、クロスカッティングの問題を追加することができなくなります。
+0

シングルトンはこれらの問題を解決するためのインターフェイスを実装できませんでしたか?インタフェースは拡張のために開いたままですが、インタフェースに依存するクライアントは、抽象化の背後にあるシングルトンインスタンスを使用していることを知る必要はありません。 – jaco0646

+0

インタフェースを持ち、 'Instance'が置換可能な場合、これはシングルトンパターンではなく、静的クラスに' Instance'プロパティが定義されているため、DIPが違反します。 – Steven

関連する問題