アブストラクトファクトリーパターンのクラス構成

アブストラクトファクトリーパターンのクラス構成と、実装方法を確認するため、日単位と月単位を切り替える処理をアブストラクトファクトリーパターンで作成しました。

まずは、日単位と月単位を切り替える処理で作成したクラスです。
作成したクラスは、大きく分けて以下の5種類になります。

1.クライアントクラス
必要な部品に対応するファクトリークラスを引数として受け取ることで、引数のファクトリークラスを使用して、必要な部品を生成するクラス
アブストラクトファクトリークラスと、アブストラクトプロダクトクラスのI/Fのみを利用する

2.アブストラクトファクトリークラス
プロダクトのオブジェクトを生成するためのI/Fを定義したクラス

3.コンクリエイトファクトリークラス
プロダクトのオブジェクトを生成するための具体的な処理を実装したクラス
アブストラクトファクトリークラスを継承して作成する

4.アブストラクトプロダクトクラス
部品となるプロダクトのI/Fを定義したクラス

5.コンクリエイトプロダクトクラス
部品を生成するための具体的な処理を実装したクラス
アブストラクトプロダクトクラスを軽装して作成する

次に、実際に作成したソースコードです。
1.クライアントクラス

public class DateClient
 {
        public DateTimeBase CreateDate(BaseFactory factory)
        {
            var now = DateTime.Now;

            var dateClass = factory.MakeDateClass(now);
            var detailItem = factory.MakeDetailItem();

            dateClass.Component = detailItem;

            return dateClass;
        }
}

2.アブストラクトファクトリークラス

public abstract class BaseFactory
 {
       // プロダクトを生成するためのI/Fを宣言
        public abstract DateClass MakeDateClass(DateTime date);

        public abstract DetailItem MakeDetailItem();
 }

3.コンクリエイトファクトリークラス

// 2.アブストラクトファクトリーを継承する
public class DateFactory : BaseFactory
{
        public override DateClass MakeDateClass(DateTime date)
        {
            return new DateClass(date);
        }

        public override DetailItem MakeDetailItem()
        {
            return new DetailItem();
        }
}

4.アブストラクトプロダクトクラス

public abstract class DateTimeBase
 {
        protected DateTime mDate;

        public DateTimeBase()
        {
        }

        public DetailItem Component { get; set; }

        public abstract string ShowDateString();

        public abstract string ShowDateJpnCalender();
}

5.コンクリエイトプロダクトクラス

public class DateClass : DateTimeBase
{
        public DateClass(DateTime date)
        {
            mDate = date;
        }

        public override string ShowDateString()
        {
            return mDate.ToString("yyyyMMdd");
        }

        public override string ShowDateJpnCalender()
        {
            var jpnCalenderBuilder = new StringBuilder();

            jpnCalenderBuilder.Append(mDate.Year.ToString());
            jpnCalenderBuilder.Append("年");
            jpnCalenderBuilder.Append(mDate.Month.ToString());
            jpnCalenderBuilder.Append("月");
            jpnCalenderBuilder.Append(mDate.Day.ToString());
            jpnCalenderBuilder.Append("日");

            return jpnCalenderBuilder.ToString();
        }
 }