2014年08月17日

アブストラクト・ファクトリー 

AbstactFactory

関連ある複雑なインスタンス群の生成を制約させる場合などに使用。

例えば、ある基本画面に対し付加的な機能を追加できるように実装する場合(アドインを任意に作成できるようにする場合)に、関連するすべてのクラスを生成させるためなどに使う。

Sample Code

ここでは、アドインを作成する側に、メインページクラスとサブページクラスを作成することを制約させてみる。

アドインを使う側でメインページとサブページの継承元クラスを抽象クラスとして定義し、それらを生成するファクトリクラスも抽象クラスとして定義する。
    abstract class AbstractMainPage { }
    abstract class AbstractSubPage { }

    abstract class AbstractFactory
    {
        public abstract AbstractMainPage CreateMainPage();
        public abstract AbstractSubPage CreateSubPage();
    }


アドインを実装する側はこれらを継承してメインページ・サブページ・ファクトリを実装する。
    class SampleMainPage : AbstractMainPage { }
    class SampleSubPage : AbstractSubPage { }
    
    class SampleFactory : AbstractFactory
    {
        public override AbstractMainPage CreateMainPage() { return new SampleMainPage(); }
        public override AbstractSubPage CreateSubPage() { return new SampleSubPage(); }
    }
アドインを使う側で、これらのファクトリを利用して各メインページ・サブページのインスタンスを取得使用する。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;

namespace SampleNameSpace
{
    class Tester
    {
        static void Main(string[] args)
        {
            GetFactoryList(args[0]).ToList().ForEach(factory =>
            {
                var mainPage = factory.CreateMainPage();
                var subPage = factory.CreateSubPage();
            });
        }

        // ファクトリの取得
        // ここでは、指定されたアセンブリ名からAbstractFactoryクラスを継承して実装されたクラスを
        // 取得し、そのインスタンスを生成してリストに追加しそのリストを返却している。
        static IList<AbstractFactory> GetFactoryList(string path)
        {
            IList<AbstractFactory> list = new List<AbstractFactory>();
            var typeList = Assembly..Load(path).GetTypes().Where(t => t.BaseType != null && t.BaseType.Name.Equals(typeof(AbstractFactory).Name)).Select(p=>p);

            typeList.ToList().ForEach(t => list.Add(Activator.CreateInstance(t) as AbstractFactory));

            return list;
        }
    }
}

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

メールアドレス:

ホームページアドレス:

コメント:

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