2

たまに見かけるパターンはこんな感じです。

public class JustAnotherClass
{
    private JustAnotherClass()
    {
        // do something
    }

    static JustAnotherClass GetNewClass()
    {
        return new JustAnotherClass();
    }
}

これは、パブリック コンストラクターを使用するよりも有利になるのはなぜでしょうか。

4

6 に答える 6

4

これは、パブリック コンストラクターを使用するよりも有利になるのはなぜでしょうか。

工場仕様です。これらのインスタンスが作成される単一のポイントがあります。

利点は、派生クラスのインスタンスを返すなど、将来の拡張でロジックを追加できることです。nullまたは特定の条件下で戻ること。コンストラクターは を返すことができませんnull

于 2012-10-01T10:46:15.743 に答える
0

柔軟であることに加えて、コンストラクターでパラメーターを使用する場合 (少なくともこの動作) と XML シリアル化を同時に使用する場合は、このアプローチが必要です。

于 2012-10-01T10:49:49.067 に答える
0

あなたの例のように、本当の利点はありません。クラスのインスタンスを作成するタイミングと方法を制御する場合は、ファクトリ メソッドを使用します。いくつかの例:

  • 常に同じインスタンスを返すSingletonを実装したい。
  • キャッシュを実装し、既存のインスタンスが使用できない場合にのみ新しいインスタンスが作成されるようにします。
  • 外部情報に基づいてインスタンスがいつ作成されるかを制御する必要があります。Fileたとえば、ファイル システムをマッピングしていて、同じパス名に対してクラスのインスタンスが 2 つ存在しないようにしたい場合があります。
于 2012-10-01T11:30:00.267 に答える
0

static新しいオブジェクトを作成するためだけにメソッドを使用する利点はありません。コンストラクタを直接呼び出すのとほぼ同じです。

これにより、パブリック コンストラクターでは不可能なコードのスケーラビリティが向上します。Henk holtermanの回答も確認してください。

于 2012-10-01T10:46:48.600 に答える
0
  1. 派生クラスを返すことができます。
    基本クラスの内部実装が異なる場合がありますが、それは実装の詳細であるため、消費者は自分がどれを取得したかを知る必要はありません。
  2. 名前があります。
    コンストラクターをオーバーロードする代わりによく使用するので、この新しいインスタンスの意味がより明確になります。

私の最近のプロジェクトからの 1 つの例: 非対称鍵ペアを表すクラスがあります。コンストラクターは保護されており、 と の 2 つのファクトリ メソッドが FromPrivateKey(byte[])ありGenerateIdentity()ます。IMO これにより、消費するコードが読みやすくなります。

于 2012-10-01T10:48:29.260 に答える
0

良い質問。表示するクラスはファクトリです (ファクトリ パターンを参照)。では、「なぜファクトリを使用するのか」... 良い質問をしました。

私にとっては、実行時に (何度も) インスタンスを作成する必要があるときにファクトリを使用します。なんで?単体テストを使用してコードをテストしやすくするためです。これは質問に対する 1 つの回答であり、コードの単体テスト (およびおそらく TDD) を行わない場合は関係ありません。ここに間違いや権利はありません。ただの事実です。

あなたの質問に答えるには、「なぜ工場を使うのか」と尋ねてください。

于 2012-10-01T10:48:55.383 に答える