你想要的听起来与Color
结构非常相似。它具有大量预定义的类,但仍允许“自定义”颜色。
Color
但是,与 不同的是,Country
它的属性可能会随着时间而变化,并且可能会受益于拥有可以更新的外部数据源。还有有限数量的国家,因此您可以通过没有成千上万的“法国”实例来优化内存。
一种适合的模式是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