做软件网站/百度seo排名曝光行者seo
介绍
工厂方法模式中考虑的是一类产品的生产,如畜牧场只养动物、电视机厂只生产电视机、计算机软件学院只培养计算机软件专业的学生等。
同种类称为同等级,也就是说,工厂方法模式只考虑生产同等级的产品,但是在现实生活中许多工厂是综合型的工厂,能生产多等级(种类) 的产品,如农场里既养动物又种植物,电器厂既生产电视机又生产洗衣机或空调,大学既有软件专业又有生物专业等。
抽象工厂模式将考虑多等级产品的生产,将同一个具体工厂所生产的位于不同等级的一组产品称为一个产品族。
定义
是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。
抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。
代码实现
下面就以生活中 “绝味” 连锁店的例子来实现一个抽象工厂模式。例如,绝味鸭脖想在江西南昌和上海开分店,但是由于当地人的口味不一样,在南昌的所有绝味的东西会做的辣一点,而上海不喜欢吃辣的,所以上海的所有绝味的东西都不会做的像南昌的那样辣,然而这点不同导致南昌绝味工厂和上海的绝味工厂生成所有绝味的产品都不同,也就是某个具体工厂需要负责一系列产品(指的是绝味所有食物)的创建工作,下面就具体看看如何使用抽象工厂模式来实现这种情况。
/// <summary>/// 下面以绝味鸭脖连锁店为例子演示下抽象工厂模式/// 因为每个地方的喜欢的口味不一样,有些地方喜欢辣点的,有些地方喜欢吃不辣点/// 客户端调用/// </summary>class Client{static void Main(string[] args){// 南昌工厂制作南昌的鸭脖和鸭架AbstractFactory nanChangFactory = new NanChangFactory();YaBo nanChangYabo = nanChangFactory.CreateYaBo();nanChangYabo.Print();YaJia nanChangYajia= nanChangFactory.CreateYaJia();nanChangYajia.Print();// 上海工厂制作上海的鸭脖和鸭架AbstractFactory shangHaiFactory = new ShangHaiFactory();shangHaiFactory.CreateYaBo().Print();shangHaiFactory.CreateYaJia().Print();Console.Read();}}/// <summary>/// 抽象工厂类,提供创建两个不同地方的鸭架和鸭脖的接口/// </summary>public abstract class AbstractFactory{// 抽象工厂提供创建一系列产品的接口,这里作为例子,只给出了绝味中鸭脖和鸭架的创建接口public abstract YaBo CreateYaBo();public abstract YaJia CreateYaJia();}/// <summary>/// 南昌绝味工厂负责制作南昌的鸭脖和鸭架/// </summary>public class NanChangFactory : AbstractFactory{// 制作南昌鸭脖public override YaBo CreateYaBo(){return new NanChangYaBo();}// 制作南昌鸭架public override YaJia CreateYaJia(){return new NanChangYaJia();}}/// <summary>/// 上海绝味工厂负责制作上海的鸭脖和鸭架/// </summary>public class ShangHaiFactory : AbstractFactory{// 制作上海鸭脖public override YaBo CreateYaBo(){return new ShangHaiYaBo();}// 制作上海鸭架public override YaJia CreateYaJia(){return new ShangHaiYaJia();}}/// <summary>/// 鸭脖抽象类,供每个地方的鸭脖类继承/// </summary>public abstract class YaBo{/// <summary>/// 打印方法,用于输出信息/// </summary>public abstract void Print();}/// <summary>/// 鸭架抽象类,供每个地方的鸭架类继承/// </summary>public abstract class YaJia{/// <summary>/// 打印方法,用于输出信息/// </summary>public abstract void Print();}/// <summary>/// 南昌的鸭脖类,因为江西人喜欢吃辣的,所以南昌的鸭脖稍微会比上海做的辣/// </summary>public class NanChangYaBo : YaBo{public override void Print(){Console.WriteLine("南昌的鸭脖");}}/// <summary>/// 上海的鸭脖没有南昌的鸭脖做的辣/// </summary>public class ShangHaiYaBo : YaBo{public override void Print(){Console.WriteLine("上海的鸭脖");}}/// <summary>/// 南昌的鸭架/// </summary>public class NanChangYaJia : YaJia{public override void Print(){Console.WriteLine("南昌的鸭架子");}}/// <summary>/// 上海的鸭架/// </summary>public class ShangHaiYaJia : YaJia{public override void Print(){Console.WriteLine("上海的鸭架子");}}
如果 “绝味”公司又想在湖南开一家分店怎么办呢? 因为湖南人喜欢吃麻辣的,下面就具体看看应用了抽象工厂模式的系统是如何应对这种需求的
/// <summary>/// 如果绝味又想开一家湖南的分店时,因为湖南喜欢吃麻的/// 所以这是有需要有一家湖南的工厂专门制作/// </summary>public class HuNanFactory : AbstractFactory{// 制作湖南鸭脖public override YaBo CreateYaBo(){return new HuNanYaBo();}// 制作湖南鸭架public override YaJia CreateYaJia(){return new HuNanYajia();}}/// <summary>/// 湖南的鸭脖/// </summary>public class HuNanYaBo : YaBo{public override void Print(){Console.WriteLine("湖南的鸭脖");}}/// <summary>/// 湖南的鸭架/// </summary>public class HuNanYajia : YaJia{public override void Print(){Console.WriteLine("湖南的鸭架子");}}
此时,只需要添加三个类:一个是湖南具体工厂类,负责创建湖南口味的鸭脖和鸭架,另外两个类是具有湖南口味的鸭脖类和鸭架类。从上面代码看出,抽象工厂对于系列产品的变化支持 “开放——封闭”原则(指的是要求系统对扩展开放,对修改封闭),扩展起来非常简便,但是,抽象工厂对于添加新产品这种情况就不支持”开放封闭 “原则,这也是抽象工厂的缺点所在。
优缺点
抽象工厂模式很难支持新种类产品的变化。这是因为抽象工厂接口中已经确定了可以被创建的产品集合,如果需要添加新产品,此时就必须去修改抽象工厂的接口,这样就涉及到抽象工厂类的以及所有子类的改变,这样也就违背了“开发——封闭”原则。
知道了抽象工厂的优缺点之后,也就能很好地把握什么情况下考虑使用抽象工厂模式了。