【デザインパターン】Simple Factoryパターン

Simple Factoryパターン

 * GoFではないけど、Factoryパターンの基礎になるらしいので...

サンプル

Dater.cs

* DateTime型と表示するためのstring型をもつ基本クラス
public class Dater
{
    protected DateTime date;
    protected string dateString;

    public Dater(string date)
    {
        this.date = DateTime.Parse(date);
    }

    public DateTime GetDate()
    {
        return this.date;
    }

    public string GetDateString()
    {
        return this.dateString;
    }
}

DateFactory.cs

* 入力条件によって、和暦用クラスか西暦用クラスかを返す
* 利用者側は、特に意識する必要はない
public class DateFactory
{
    public Dater Create(string date)
    {
        if (date.Trim().StartsWith("H") ||
            date.Trim().StartsWith("h"))
        {
            return new JapaneseEra(date);
        }
        else
        {
            return new AnnoDomini(date);
        }
    }
}

AnnoDomini.cs

* 基本クラスを継承した西暦用クラス
public class AnnoDomini : Dater
{
    public AnnoDomini(string date)
        : base(date)
    {
        this.dateString = this.date.ToString("yyyy/MM/dd");
    }
}

JapaneseEra.cs

* 基本クラスを継承した和暦用クラス
public class JapaneseEra : Dater
{
    public JapaneseEra(string date)
        : base(date)
    {
        CultureInfo culture = new CultureInfo("ja-JP", true);
        culture.DateTimeFormat.Calendar = new JapaneseCalendar();

        this.dateString = this.date.ToString("ggyy年M月d日", culture);
    }
}

Fotm1.cs

* 作成したクラスを使用し、ラベルに表示
private void button1_Click(object sender, EventArgs e)
{
    DateFactory dateFactory = new DateFactory();
    Dater dater = dateFactory.Create(this.textBox1.Text);

    this.label1.Text = dater.GetDateString();
}

出力例

H21.11.23
平成21年11月23日
h21/1/23
平成21年1月23日
2001/1/23
2001/01/23