1

正しいタイプのみを作成するファクトリ

Factoryしたがって、正しいタイプのみを返す例を次に示します。

public class BirdFactory
{
    public static IBird CreateBird(string birdType)
    {
        switch (birdType)
        {
            case "Eagle":
                return new Eagle();
            case "Penguin":
                return new Penguin();
        }
    }
}

次のように使用されます:

IBird bird = BirdFactory.CreateBird("eagle");
bird.FlyToLocation(new Location("London"));

正しいタイプの作成と状態の設定の因数分解

状態とタイプを設定するために使用されているファクトリの例を次に示します。

public class BirdFactory
{
    public static IBird CreateBird(string birdType, Location locationToFlyTo)
    {
        switch (birdType)
        {
            case "Eagle":
                return new Eagle(locationToFlyTo);
            case "Penguin":
                return new Penguin(locationToFlyTo);
        }
    }
}

次のように使用されます:

IBird bird = BirdFactory.CreateBird("eagle", new Location("London"));
bird.FlyToLocation();

質問

2番目のプラクティスはどの程度受け入れられますか?どちらがより保守しやすいですか?

4

4 に答える 4

3

ファクトリ パターンで型と共に状態を設定できないという基本的な規則はありません。実際、パターンを組み合わせることは許容される方法です。したがって、2 番目の方法がニーズに完全に適合すると確信している場合は、それを選択してください。

あいまいさが少ないため、方法2よりも方法1を好みます。

IBird bird = BirdFactory.CreateBird("eagle", new Location("London"));

ワシはロンドンに「住んでいる」(または生まれた) と読者に思わせるかもしれません。

次の行:

bird.FlyToLocation();

「それはどこへ飛んでいるの?ああ!それは鳥がロンドンに飛ばなければならないということですか?」

bird.FlyToLocation(new Location("London"));

このあいまいさを回避します。

于 2012-07-24T03:21:56.413 に答える
2

最初の練習の方が良いです。2番目に、場所をコンストラクターに渡します。場所は実際には鳥とは何の関係もありません。場所はFlyToLocationメソッド用であり、そのメソッド呼び出しにできるだけ近づける必要があります。

于 2012-07-24T00:50:42.060 に答える
0

オブジェクトに必要な初期化の複雑さに依存すると思います。それが単一のプロパティである場合、最終的にコードの複雑さはおそらく価値がありません。

ただし、複雑な初期化を実行したい場合に備えて、ビルダーパターンをファクトリーパターンに組み込みました。

于 2012-07-24T02:58:42.827 に答える
0

すでに述べたように、できることに制限はありませんが、物事をシンプルに保ち、責任を適切に分割することが、いわゆる「優れた設計」の鍵となります。したがって、ファクトリ メソッド自体はオブジェクトの作成のみを担当する必要があります。この場合は IBird インスタンスです。実装に場所も必要な場合は、ファクトリのデフォルトの場所を使用し、それが使用される場所はどこでも使用します。後で場所を設定します。このようにして、後でファクトリを変更することもできます。このメカニズムが柔軟であることがわかる 1 つの例を次に示します。あなたが説明したファクトリがあると想像してください-場所が渡されています.明日、使用されているIBirdの実装を変更することに決めたので、場所を使用しなくなりました.

よろしく、 アルタク

于 2012-07-24T03:31:06.567 に答える