ios开发入门,seo网站优化专家,佛山网站设计联系方式,千锋教育前端培训一、为什么需要抽象工厂模式#xff1f;
在工厂模式中#xff0c;我们需要定义多个继承于共同工厂抽象基类的工厂子类#xff0c;这些子类负责创建一个对应的对象。工厂模式存在一个缺点就是#xff1a;每次扩展新的工厂子类#xff0c;就会增加系统的复杂度。
如果我们…一、为什么需要抽象工厂模式
在工厂模式中我们需要定义多个继承于共同工厂抽象基类的工厂子类这些子类负责创建一个对应的对象。工厂模式存在一个缺点就是每次扩展新的工厂子类就会增加系统的复杂度。
如果我们知道把所有产品比如车分为几个产品族比如自行车族、汽车族那么工厂子类就对应指定的产品族进行“批量”创建对象。若有新的产品则工厂子类创建该新产品对象。工厂子类内部逻辑类似于简单工厂模式
抽象工厂模式 类似于简单工厂模式和工厂模式混合运用而成的模式。参考上篇文章“工厂模式”的最后一个代码例子
优点 不需要每次定义一个新的产品类时就要扩展新的工厂子类。工厂子类提供一个产品族中多个对象的创建工作客户端可以方便使用某个产品族中的对象。
缺点 产品族扩展难。要增加一个新系列的某一产品要定义产品抽象类、产品实现类工厂抽象基类工厂子类。
【角色】 某系列抽象基类 用以定义某产品族的特征和行为的抽象接口。 某系列的某产品实现类 继承某系列抽象基类用以实现某系列里某产品的特征和行为的具体类。 工厂抽象基类 用以定义创建对象的特征的抽象接口。特征行为包括提供某系列产品的抽象方法。 工厂子类 对对应的实现类进行实例化。实现提供某系列某产品的方法。 二、例子
需求 假定某些地方的主要交通工具有自行车和汽车。为了满足人们交通便利的需求现有XX公司和YY公司这两家公司对市场推行了两种运营模式租车和共享车。也就是说租车和共享车是这两家公司所推广的两个产品系列业务即两个产品族。
1定义产品族和具体产品 //共享车系列产品族public abstract class Share{public abstract void Move();}//租借车系列public abstract class Rent{public abstract void Move();}//XX公司-共享-自行车public class XXBikeShare : Share{public override void Move(){Console.WriteLine(Share XXBike move.);}}//XX公司-共享-汽车public class XXCarShare : Share{public override void Move(){Console.WriteLine(share XXCar move.);}}//XX公司-租借-自行车public class XXBikeRent : Rent{public override void Move(){Console.WriteLine(Rent XXBike move.);}}//XX公司-租借-汽车public class XXCarRent : Rent{public override void Move(){Console.WriteLine(Rent XXCar move.);}}//YY公司-共享-自行车public class YYBikeShare : Share{public override void Move() {Console.WriteLine(share YYBike move.);}}//YY公司-共享-汽车public class YYCarShare : Share{public override void Move() {Console.WriteLine(share YYCar move.);}}//YY公司-租借-自行车public class YYBikeRent : Rent{public override void Move(){Console.WriteLine(Rent YYBike move.);}}//YY公司-租借-汽车public class YYCarRent : Rent{public override void Move(){Console.WriteLine(Rent YYCar move.);}}
2定义工厂基类和工厂子类 //定义提供两个产品族的抽象方法public abstract class Factory{public abstract Share ProvideS(string args);public abstract Rent ProvideR(string args);}//XX公司落实产品业务租借和共享public class XXFactory : Factory{public override Share ProvideS(string args){Share share null;switch (args){case XXBike:share new XXBikeShare(); break;case XXCar:share new XXCarShare(); break;default:throw new ArgumentException(args is Invalid. new obj failed.);}return share;}public override Rent ProvideR(string args){Rent rent null;switch (args){case XXBike:rent new XXCarRent(); break;case XXCar:rent new XXBikeRent(); break;default:throw new ArgumentException(args is Invalid. new obj failed.);}return rent;}}//YY公司落实产品业务租借和共享public class YYFactory : Factory{public override Share ProvideS(string args){Share share null;switch (args){case YYBike:share new YYBikeShare(); break;case YYCar:share new YYCarShare(); break;default:throw new ArgumentException(args is Invalid. new obj failed.);}return share;}public override Rent ProvideR(string args){Rent rent null;switch (args){case YYBike:rent new YYBikeRent(); break;case YYCar:rent new YYCarRent(); break;default:throw new ArgumentException(args is Invalid. new obj failed.);}return rent;}}
3在客户端使用 class Program{static void Main(string[] args){Factory xx new XXFactory();Factory yy new YYFactory();var sharexxCar xx.ProvideS(XXCar);sharexxCar.Move();var rentyyBike yy.ProvideR(YYBike);rentyyBike.Move();Console.ReadLine();}}