抽象工厂模式

  前两篇博文主要是针对我们出行开什么车,怎么选车这样的问题所做的设计,针对的是同一个具体产品族: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     }
View Code

产品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     }
View Code

工厂类:

 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     }
View Code

客户端:

 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         }
View Code

运行结果:

抽象工厂模式和工厂方法模式有些容易混淆,不过适用的场景还是存在一定的区别:工厂模式专注于单一产品(对象)

的生产过程,而抽象工厂模式更关注的是可以生产多种产品系列。

在我们的项目开发种最常见的就是关于项目数据库的适配操作,项目需要针对不同的数据库类型提供不同的访问数据库的

对象,这时候就会才用抽象工厂模式,但也不是单纯的抽象工厂模式,一般是简单工厂+抽象工厂模式+反射+配置文件

的搭配,后面的会在博文中进行详细的介绍。

原文地址:https://www.cnblogs.com/ultimateWorld/p/5696281.html