2

インスタンスを直接作成できないさまざまなクラスに遭遇しました。むしろ、他のクラスの静的メソッドまたは独自の静的メソッドからインスタンスを作成する必要があります。例えば:

B b = A.getB();

また

B b = B.getInstance();

その背後にある理由は何ですか?

次のように、インスタンスを直接作成できないのはなぜですか。

B b = new B();
4

5 に答える 5

7

一部のクラスは、インスタンス化される方法を制御したいため、コンストラクターをパブリックな使用から保護します。のような静的ファクトリメソッドをgetInstance使用して、そのコントロールを独自のコード内に保持できるようにします。

これをしたい理由は何百万もあります。

編集new:コメントに対処するために、オペレーターは常に新しいインスタンスを作成するため(例外がスローされない限り)、コンストラクター内でこれを行うことはできません。コンストラクターが呼び出されるまでに、コンストラクター内のコードがオブジェクトがインスタンス化されるかどうかを制御するには遅すぎます。

于 2010-01-23T18:42:08.013 に答える
4

これらはシングルトンパターンの例です。それらは通常プライベートコンストラクターメソッドを持っていますが、私がリンクした例では、インスタンス化を防ぐために保護されたものを使用していました。

抽象クラスもインスタンス化できません。

于 2010-01-23T18:37:40.910 に答える
2

いくつかのユースケース:

  1. ファクトリパターンでは、オブジェクトのインターフェイスのみが表示され、実装自体はファクトリによって選択および変更できます。
  2. createInstanceメソッドは、ctor内では実行できない追加の作業をバックグラウンドで実行します
  3. クラスはこのオブジェクトにシングルトンを使用でき、常に同じインスタンスを返します
于 2010-01-23T19:44:45.460 に答える
1

オブジェクトに複雑な作成ロジックがある場合、設計者はオブジェクトの作成を特定のオブジェクトに委任します 。これは単一責任の原則に従います。目標は、オブジェクトがその作成に必要な構造と手順を無視できるようにすることです。

Factoryを使用しない場合、複雑なオブジェクトを作成するには、パラメーターが多すぎる長いコンストラクターが必要になります。

このgetInstance()場合、設計者は、アプリケーション全体でオブジェクトの単一インスタンスにアクセスできるようにしたいと考えていました。これはシングルトンパターンであり、グローバル変数に相当します。

于 2010-01-23T18:59:50.433 に答える
1

どちらも作成パターンの実装です。つまり、状況に適した方法でオブジェクトを作成しようとする、オブジェクト作成メカニズムを処理するパターンです。

  • 最初の例は、ファクトリメソッドパターンのように見えます。オブジェクトを作成するためのインターフェイスを定義しますが、インスタンス化するクラスをサブクラスに決定させます。ファクトリメソッドを使用すると、クラスはインスタンス化をサブクラス[Gof]に延期できます。

  • 2番目の例はシングルトンパターンです:クラスの単一のインスタンスのみを作成できるファクトリ。

特定の問題を解決するために作成がどのように行われるかを正確に制御newすることを目的としているため、インスタンスを直接作成することはできません。クラスのインスタンス化をシングルトンの1つのオブジェクトに制限し、サブクラスにファクトリのインスタンス化するクラスを決定させます。 。

于 2010-01-23T19:41:41.590 に答える