前两篇博文主要是针对我们出行开什么车,怎么选车这样的问题所做的设计,针对的是同一个具体产品族:MyCar。
而我们接下来说的抽象工厂模式是针对不同的多种产品族而言的,工厂方法模式对应的是一个工厂内的一个产品线,只负责生产
一种产品:MyCar,而抽象工厂模式对应的则是整个工厂,负责多种产品线以及生产什么的控制。
抽象工厂模式Demo类图:
例子可能不能那么形象的比喻,不过原理是如此的,根据不同的应用场景转换。我们就改为城堡吧,我们的大仓库停放着各种交通工具,其中有
汽车、飞机、机车等等。有的时候我们的出行单纯的汽车并不能满足,这时候就需要其他的交通工具如飞机。当我们出海旅游时,驾驶汽车到
海边,然后驾驶水上飞机低空飞行。
产品1类(MyCar):
1 public abstract class MyCar 2 { 3 public abstract string Color { get; } 4 public abstract void Driving(); 5 } 6 7 /// <summary> 8 /// 商务车 9 /// </summary> 10 public class BusinessCar : MyCar 11 { 12 public override string Color 13 { 14 get 15 { 16 return "Black"; 17 } 18 } 19 20 public override void Driving() 21 { 22 Console.WriteLine("驾驶商务车"); 23 } 24 } 25 26 /// <summary> 27 /// 越野车 28 /// </summary> 29 public class OffroadCar : MyCar 30 { 31 public override string Color 32 { 33 get 34 { 35 return "White"; 36 } 37 } 38 39 public override void Driving() 40 { 41 Console.WriteLine("驾驶越野车"); 42 } 43 } 44 45 /// <summary> 46 /// 跑车 47 /// </summary> 48 public class SportCar : MyCar 49 { 50 public override string Color 51 { 52 get 53 { 54 return "Red"; 55 } 56 } 57 58 public override void Driving() 59 { 60 Console.WriteLine("驾驶跑车"); 61 } 62 }
产品2类(MyPlane):
1 public abstract class MyPlane 2 { 3 public abstract int Speed { get; } 4 public abstract void Flying(); 5 } 6 7 public class Helicopter : MyPlane 8 { 9 public override int Speed 10 { 11 get 12 { 13 return 350; 14 } 15 } 16 17 public override void Flying() 18 { 19 Console.WriteLine("直升机飞行中"); 20 } 21 } 22 23 public class Jet : MyPlane 24 { 25 public override int Speed 26 { 27 get 28 { 29 return 880; 30 } 31 } 32 33 public override void Flying() 34 { 35 Console.WriteLine("客机飞行中"); 36 } 37 } 38 39 public class Seaplane : MyPlane 40 { 41 public override int Speed 42 { 43 get 44 { 45 return 220; 46 } 47 } 48 49 public override void Flying() 50 { 51 Console.WriteLine("水上飞机飞行中"); 52 } 53 }
工厂类:
1 /// <summary> 2 /// 抽象工厂 3 /// </summary> 4 public abstract class Factory 5 { 6 public abstract MyCar SelectCar(); 7 8 public abstract MyPlane SelectPlane(); 9 } 10 11 12 public class BusinessFactory : Factory 13 { 14 public override MyCar SelectCar() 15 { 16 return new BusinessCar(); 17 } 18 19 public override MyPlane SelectPlane() 20 { 21 return new Jet(); 22 } 23 } 24 25 26 public class SportFactory : Factory 27 { 28 public override MyCar SelectCar() 29 { 30 return new SportCar(); 31 } 32 33 public override MyPlane SelectPlane() 34 { 35 return new Seaplane(); 36 } 37 } 38 39 public class OffroadFactory : Factory 40 { 41 public override MyCar SelectCar() 42 { 43 return new OffroadCar(); 44 } 45 46 public override MyPlane SelectPlane() 47 { 48 return new Helicopter(); 49 } 50 }
客户端:
1 static void Main(string[] args) 2 { 3 //去海边玩喽 4 Factory factory = new SportFactory(); 5 MyCar myCar= factory.SelectCar(); 6 MyPlane myPlane = factory.SelectPlane(); 7 myCar.Driving(); 8 Thread.Sleep(1000); 9 myPlane.Flying(); 10 Console.ReadLine(); 11 }
运行结果:
抽象工厂模式和工厂方法模式有些容易混淆,不过适用的场景还是存在一定的区别:工厂模式专注于单一产品(对象)
的生产过程,而抽象工厂模式更关注的是可以生产多种产品系列。
在我们的项目开发种最常见的就是关于项目数据库的适配操作,项目需要针对不同的数据库类型提供不同的访问数据库的
对象,这时候就会才用抽象工厂模式,但也不是单纯的抽象工厂模式,一般是简单工厂+抽象工厂模式+反射+配置文件
的搭配,后面的会在博文中进行详细的介绍。