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