抽象工厂模式

时间:2022-01-21 06:06:46

标签:

一、引言

在上一专题中介绍了工厂方法模式,工厂方法模式是为了克服简单工厂模式的缺点而设计出来的,简单工厂模式的工厂类随着产品类的增加需要增加额外的代码),而工厂方法模式每个具体工厂类只完成单个实例的创建,所以它具有很好的可扩展性。但是在现实生活中,一个工厂只创建单个产品这样的例子很少,因为现在的工厂都多元化了,一个工厂创建一系列的产品,如果我们要设计这样的系统时,工厂方法模式显然在这里不适用,然后抽象工厂模式却可以很好地解决一系列产品创建的问题,这是本专题所要介绍的内容。

二、抽象工厂详细介绍

这里首先以一个生活中抽象工厂的例子来实现一个抽象工厂,然后再给出抽象工厂的定义和UML图来帮助大家更好地掌握抽象工厂模式,同时大家在理解的时候,可以对照抽象工厂生活中例子的实现和它的定义来加深抽象工厂的UML图理解。

2.1 抽象工厂的具体实现

下面就以生活中 “绝味” 连锁店的例子来实现一个抽象工厂模式。例如,绝味鸭脖想在江西南昌和上海开分店,但是由于当地人的口味不一样,在南昌的所有绝味的东西会做的辣一点,而上海不喜欢吃辣的,所以上海的所有绝味的东西都不会做的像南昌的那样辣,然而这点不同导致南昌绝味工厂和上海的绝味工厂生成所有绝味的产品都不同,也就是某个具体工厂需要负责一系列产品(指的是绝味所有食物)的创建工作,下面就具体看看如何使用抽象工厂模式来实现这种情况。

1 /// <summary> 2 /// 下面以绝味鸭脖连锁店为例子演示下抽象工厂模式 3 /// 因为每个地方的喜欢的口味不一样,有些地方喜欢辣点的,有些地方喜欢吃不辣点 4 /// 客户端调用 5 /// </summary> 6 class Client 7 { 8 static void Main(string[] args) 9 { 10 // 南昌工厂制作南昌的鸭脖和鸭架 11 AbstractFactory nanChangFactory = new NanChangFactory(); 12 YaBo nanChangYabo = nanChangFactory.CreateYaBo(); 13 nanChangYabo.Print(); 14 YaJia nanChangYajia= nanChangFactory.CreateYaJia(); 15 nanChangYajia.Print(); 16 17 // 上海工厂制作上海的鸭脖和鸭架 18 AbstractFactory shangHaiFactory = new ShangHaiFactory(); 19 shangHaiFactory.CreateYaBo().Print(); 20 shangHaiFactory.CreateYaJia().Print(); 21 22 Console.Read(); 23 } 24 } 25 26 /// <summary> 27 /// 抽象工厂类,提供创建两个不同地方的鸭架和鸭脖的接口 28 /// </summary> 29 public abstract class AbstractFactory 30 { 31 // 抽象工厂提供创建一系列产品的接口,这里作为例子,只给出了绝味中鸭脖和鸭架的创建接口 32 public abstract YaBo CreateYaBo(); 33 public abstract YaJia CreateYaJia(); 34 } 35 36 /// <summary> 37 /// 南昌绝味工厂负责制作南昌的鸭脖和鸭架 38 /// </summary> 39 public class NanChangFactory : AbstractFactory 40 { 41 // 制作南昌鸭脖 42 public override YaBo CreateYaBo() 43 { 44 return new NanChangYaBo(); 45 } 46 // 制作南昌鸭架 47 public override YaJia CreateYaJia() 48 { 49 return new NanChangYaJia(); 50 } 51 } 52 53 /// <summary> 54 /// 上海绝味工厂负责制作上海的鸭脖和鸭架 55 /// </summary> 56 public class ShangHaiFactory : AbstractFactory 57 { 58 // 制作上海鸭脖 59 public override YaBo CreateYaBo() 60 { 61 return new ShangHaiYaBo(); 62 } 63 // 制作上海鸭架 64 public override YaJia CreateYaJia() 65 { 66 return new ShangHaiYaJia(); 67 } 68 } 69 70 /// <summary> 71 /// 鸭脖抽象类,供每个地方的鸭脖类继承 72 /// </summary> 73 public abstract class YaBo 74 { 75 /// <summary> 76 /// 打印方法,用于输出信息 77 /// </summary> 78 public abstract void Print(); 79 } 80 81 /// <summary> 82 /// 鸭架抽象类,供每个地方的鸭架类继承 83 /// </summary> 84 public abstract class YaJia 85 { 86 /// <summary> 87 /// 打印方法,用于输出信息 88 /// </summary> 89 public abstract void Print(); 90 } 91 92 /// <summary> 93 /// 南昌的鸭脖类,因为江西人喜欢吃辣的,所以南昌的鸭脖稍微会比上海做的辣 94 /// </summary> 95 public class NanChangYaBo : YaBo 96 { 97 public override void Print() 98 { 99 Console.WriteLine("南昌的鸭脖"); 100 } 101 } 102 103 /// <summary> 104 /// 上海的鸭脖没有南昌的鸭脖做的辣 105 /// </summary> 106 public class ShangHaiYaBo : YaBo 107 { 108 public override void Print() 109 { 110 Console.WriteLine("上海的鸭脖"); 111 } 112 } 113 114 /// <summary> 115 /// 南昌的鸭架 116 /// </summary> 117 public class NanChangYaJia : YaJia 118 { 119 public override void Print() 120 { 121 Console.WriteLine("南昌的鸭架子"); 122 } 123 } 124 125 /// <summary> 126 /// 上海的鸭架 127 /// </summary> 128 public class ShangHaiYaJia : YaJia 129 { 130 public override void Print() 131 { 132 Console.WriteLine("上海的鸭架子"); 133 } 134 }

2.2 抽象工厂模式的定义和类图

上面代码中都有详细的注释,这里就不再解释上面的代码了,下面就具体看看抽象工厂模式的定义吧(理解定义可以参考上面的实现来加深理解):

抽象工厂模式:提供一个创建产品的接口来负责创建相关或依赖的对象,而不具体明确指定具体类