インスタンスを直接作成できないさまざまなクラスに遭遇しました。むしろ、他のクラスの静的メソッドまたは独自の静的メソッドからインスタンスを作成する必要があります。例えば:
B b = A.getB();
また
B b = B.getInstance();
その背後にある理由は何ですか?
次のように、インスタンスを直接作成できないのはなぜですか。
B b = new B();
インスタンスを直接作成できないさまざまなクラスに遭遇しました。むしろ、他のクラスの静的メソッドまたは独自の静的メソッドからインスタンスを作成する必要があります。例えば:
B b = A.getB();
また
B b = B.getInstance();
その背後にある理由は何ですか?
次のように、インスタンスを直接作成できないのはなぜですか。
B b = new B();
一部のクラスは、インスタンス化される方法を制御したいため、コンストラクターをパブリックな使用から保護します。のような静的ファクトリメソッドをgetInstance
使用して、そのコントロールを独自のコード内に保持できるようにします。
これをしたい理由は何百万もあります。
編集new
:コメントに対処するために、オペレーターは常に新しいインスタンスを作成するため(例外がスローされない限り)、コンストラクター内でこれを行うことはできません。コンストラクターが呼び出されるまでに、コンストラクター内のコードがオブジェクトがインスタンス化されるかどうかを制御するには遅すぎます。
これらはシングルトンパターンの例です。それらは通常プライベートコンストラクターメソッドを持っていますが、私がリンクした例では、インスタンス化を防ぐために保護されたものを使用していました。
抽象クラスもインスタンス化できません。
いくつかのユースケース:
オブジェクトに複雑な作成ロジックがある場合、設計者はオブジェクトの作成を特定のオブジェクトに委任します 。これは単一責任の原則に従います。目標は、オブジェクトがその作成に必要な構造と手順を無視できるようにすることです。
Factoryを使用しない場合、複雑なオブジェクトを作成するには、パラメーターが多すぎる長いコンストラクターが必要になります。
このgetInstance()
場合、設計者は、アプリケーション全体でオブジェクトの単一インスタンスにアクセスできるようにしたいと考えていました。これはシングルトンパターンであり、グローバル変数に相当します。
どちらも作成パターンの実装です。つまり、状況に適した方法でオブジェクトを作成しようとする、オブジェクト作成メカニズムを処理するパターンです。
最初の例は、ファクトリメソッドパターンのように見えます。オブジェクトを作成するためのインターフェイスを定義しますが、インスタンス化するクラスをサブクラスに決定させます。ファクトリメソッドを使用すると、クラスはインスタンス化をサブクラス[Gof]に延期できます。
2番目の例はシングルトンパターンです:クラスの単一のインスタンスのみを作成できるファクトリ。
特定の問題を解決するために作成がどのように行われるかを正確に制御new
することを目的としているため、インスタンスを直接作成することはできません。クラスのインスタンス化をシングルトンの1つのオブジェクトに制限し、サブクラスにファクトリのインスタンス化するクラスを決定させます。 。