あなたが望むものは、Color
構造体に非常に似ています。あらかじめ定義されたクラスの大規模なセットがありますが、「カスタム」色も使用できます。
とは異なりColor
、ただし、Country
時間の経過とともに変化する可能性のあるプロパティがあり、更新可能な外部データ ソースを持つことでメリットが得られる場合があります。国の数も限られているため、何千もの「フランス」インスタンスが浮かんでいないことでメモリを最適化できます。
それに合うパターンの 1 つはFlyweightです。ファクトリ メソッドを使用して浮遊するオブジェクトの数を最小限に抑えることができますが、事前に定義された国のセットに簡単にアクセスできます。
public class Country
{
// properties of a Country:
public int Population {get; private set;}
public string Units {get; private set;}
// etc.
// Factory method/fields follows
// storage of created countries
private static Dictionary<string, Country> _Countries = new Dictionary<string,Country>();
public static Country GetCountry(string name)
{
Country country;
if(_Countries.TryGetValue(name, out country))
return country;
//else
country = new Country();
// load data from external source
_Countries[name] = country;
return country;
}
public static Country France { get {return GetCountry("France");} }
public static Country Germany { get {return GetCountry("Germany");} }
}
現状の設計に関するいくつかの注意事項:
- スレッドセーフではありません。適切なスレッド セーフを追加する必要があります。
- 国は永遠ではありません - 事前定義された国が存在しなくなったらどうしますか?
- 理想的には、ファクトリは別のクラスにして、クラスをファクトリから切り離すことができますが、より見栄えが良い
Country
と思いますCountry.France
CountryFactory.France