使用泛型
abstract class CarFactory<TParts> where TParts : ICarParts
{
public abstract ICar Create(TParts parts);
}
class HondaFactory : CarFactory<HondaParts>
{
public override ICar Create(HondaParts parts)
{
...
}
}
... other factories
但和往常一样,泛型也有局限性.E、 例如,您无法创建列表<;工厂<&燃气轮机&燃气轮机;包含不同类型的工厂.不同类型的工厂不兼容分配.
在某些时候,您仍然需要if/else/if/else语句来获得正确的工厂.非泛型弱类型方法ICar Create(ICarParts parts)
允许更多"动态"场景.
由于C#9.0(我认为是.NET 5.0运行时),您可以使用covariant return types:
public override Honda Create(HondaParts parts)
{
...
}
假设public class Honda : ICar
.
一种更复杂的方法结合了非泛型和泛型接口.在更动态但弱类型的场景中,针对非泛型接口编程,在其他情况下,针对泛型接口编程:
public interface ICarFactory
{
ICar Create(ICarParts parts);
}
public interface ICarFactory<in TParts> : ICarFactory
where TParts : ICarParts
{
ICar Create(TParts parts);
}
abstract class CarFactory<TParts> : ICarFactory<TParts>
where TParts : ICarParts
{
ICar ICarFactory.Create(ICarParts parts) => Create((TParts)parts);
public abstract ICar Create(TParts parts);
}
注意,非泛型实现是显式完成的,因此只有在直接针对ICarFactory
接口编程时才可见.现在,您可以创建如下工厂词典:
var factories = new Dictionary<string, ICarFactory> {
["Honda"] = new HondaFactory(),
["Mercedes"] = new MercedesFactory(),
["Toyota"] = new ToyotaFactory(),
};
现在,您有责任提供正确类型的零件:
string carType = "Toyota";
ICarFactory factory = factories[carType];
ICar car = factory.Create(parts); // Not type safe!