我有一个简单的抽象工厂实现:
public abstract class ICarFactory{ public abstract ISportsCar CreateSportCar(); public abstract IFamilyCar CreateFamilyCar(); } public abstract class ISportsCar { public abstract void Accelerate(); } public abstract class IFamilyCar { public abstract void Accelarete(); } public class BMWFactory : ICarFactory { public override ISportsCar CreateSportCar() { return new BMWi7(); } public override IFamilyCar CreateFamilyCar() { return new BMWM5(); } } public class WolksvagenFactory : ICarFactory { public override ISportsCar CreateSportCar() { return new WvgolfR(); } public override IFamilyCar CreateFamilyCar() { return new Wvgolf(); } } public class BMWi7 : ISportsCar { public override void Accelerate() { Console.WriteLine(this.ToString() + "accelerated."); } } public class BMWM5 : IFamilyCar { public override void Accelarete() { Console.WriteLine(this.ToString() + "accelerated."); } } public class WvgolfR : ISportsCar { public override void Accelerate() { Console.WriteLine(this.ToString() + "accelerated."); } } public class Wvgolf : IFamilyCar { public override void Accelarete() { Console.WriteLine(this.ToString() + "accelerated."); } }
客户端代码是这样的:
class Program { static void Main(string[] args) { ISportsCar sportsCar = GetFactory().CreateSportCar(); sportsCar.Accelerate(); } static ICarFactory GetFactory() { string userLocation; userLocation = "Hamburg"; //Get user location from user settings if (userLocation == "Hamburg") { return new BMWFactory(); } else { return new WolksvagenFactory(); } } }
是否可以通过使用Microsoft.Practices.Unity来实现“GetFactory()”方法完成的工作?
我通过搜索这个问题花了很多时间.但我找不到有用的东西.
解决方法
您可以通过在每个位置注册一组特定工厂和默认工厂来实现命名注册:
_container = new UnityContainer(); //Register location specific factories _container.RegisterType<ICarFactory,BMWFactory>("Hamburg"); ... //Register the default factory _container.RegisterType<ICarFactory,WolksvagenFactory>();
然后,您可以使用以下代码解析工厂(使用IsRegistered
检查该位置是否有特定工厂):
static ICarFactory GetFactory() { string userLocation; userLocation = "Hamburg"; //Get user location from user settings //try get specific factory for location if(_container.IsRegistered<ICarFactory>(userLocation)){ return _container.Resolve<ICarFactory>(userLocation); } //if not found,get default factory return _container.Resolve<ICarFactory>(); }
见小提琴here
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。