2014年08月16日

ファクトリ・メソッド

Factory method

インスタンスの生成を、news演算子を直接使うのではなくて、Factory(工場)と呼ばれる機能で行う。
Factoryで生成されるインスタンスは、通常は派生クラスとなる。
使用する側は何の派生クラスかを意識せずに、共通の処理をコールすることができる。
インスタンス生成箇所を集約することにより、派生クラスの種類が増えた場合の影響範囲を限定させる。
※インスタンス生成を担う機能(クラス)をFactoryと言う傾向。必ずしも拡張性を考慮したものに限らないみたい。

Sample Code

ファクトリで車(派生としてコンパクトカー・ミドルカー)のインスタンスを生成返却する。
車の種類(下記でコメントアウトされているエコカー)が増えても使用する側(Main)のコードは修正不要。

    class Tester
    {
        static void Main(string[] args)
        {
            // 直接new演算子ではなくFactoryを介してインスタンスを取得
            //var car = new CompactCar();
            var car = Factory.Create(3500000);
            // 車(の種類は意識せず)を運転
            car.Drive();
        }
    }
    // ここでは静的クラスとして実装しているが必須ではない
    static class Factory
    {
       // 引き渡された金額に相当する車の派生クラスのインスタンスを生成・返却
        public static ACar Create(int price)
        {
            if(price <= 1000000)
            {
                throw new ArgumentException();
            }
            else if(price <= 3000000)
            {
                return new CompactCar();
            }
            //else if (price <= 3500000)
            //{
            //    return new EcoCar();
            //}
            else
            {
                return new MiddleCar();
            }
        }
    }

    abstract class ACar
    {
        public abstract void Drive();
    }

    class CompactCar : ACar
    {
        public override void Drive() { }
    }

    class MiddleCar : ACar
    {
        public override void Drive() { }
    }

    //class EcoCar : ACar
    //{
    //    public override void Drive() { }
    //}
posted by RR at 10:56 | Comment(0) | デザインパターン | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。