定义:

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

工厂方法模式针对的是一个产品等级结构;而抽象工厂模式针对的是多个产品等级结构。

抽象工厂模式使用同一个 工厂等级结构负责这些不同产品等级结构产品对象的创建。

所谓的抽象工厂是指一个工厂等级结构可以创建出分属于不同产品等级结构的一个产品族中的所有对象。

注意:

如果不存在”多系列对象创建“的需求变化,则没必要应用Abstract Factory模式,静态工厂方法足矣。
 "系列对象"指的是这些对象之间有相互依赖、或作用的关系。例如游戏开发场景中的"道路"与"房屋"依赖,“道路”与“地道”的依赖。
Abstract Factory模式主要在于应对"新系列"的需求变动。其缺点在于难以应对”新对象“的需求变动。
Abstract Factory模式经常和Factory Method模式共同组合来应对“对象创建”的需求变化。

区别:

Factory Mehtod模式解决"单个对象"的需求变化,AbstractFactory模式解决"系列对象"的需求变化,Builder模式解决"对象部分"的需求变化。

示例代码:

/*
抽象工厂模式:Abstract factory 这里简写为AF,为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。
所谓的抽象工厂是指一个工厂等级结构可以创建出分属于不同产品等级结构的一个产品族中的所有对象。 抽象工厂:AbstractFactory_AF 类,
具体工厂:FerrariFactory_AF 类,SkodaFactory_AF类
抽象产品:CarColor_AF 类,CarAction_AF 类
具体产品:ColorRed_AF ,ColorBlack_AF 和 FerrariCar_AF,SkodaCar_AF 产品之间相互依赖
*/ public abstract class AbstractFactory_AF {
public abstract CarColor_AF CreateColor();
public abstract CarAction_AF CreateCar();//汽车行为
}
using UnityEngine;

public class SkodaFactory_AF : AbstractFactory_AF {

    public override CarColor_AF CreateColor ()
{
return new ColorBlack_AF ();
} public override CarAction_AF CreateCar ()
{
return new SkodaCar_AF ();
}
}
using UnityEngine;

public class FerrariFactory_AF : AbstractFactory_AF {

    public override CarColor_AF CreateColor ()
{
return new ColorRed_AF ();
} public override CarAction_AF CreateCar ()
{
return new FerrariCar_AF ();
} }
using UnityEngine;

public abstract class CarAction_AF {
public abstract void Launch(CarColor_AF carColor);
public abstract void Run(CarColor_AF carColor);
public abstract void Stop(CarColor_AF carColor);
}
using UnityEngine;

public class FerrariCar_AF : CarAction_AF {

    public override void Launch (CarColor_AF carColor)
{
Debug.Log (carColor.GetColor()+"法拉利发动了");
}
public override void Run (CarColor_AF carColor)
{
Debug.Log (carColor.GetColor()+"法拉利跑起来了");
}
public override void Stop (CarColor_AF carColor)
{
Debug.Log (carColor.GetColor()+"法拉利抛锚了");
}
}
using UnityEngine;

public class SkodaCar_AF : CarAction_AF {

    public override void Launch (CarColor_AF carColor)
{
Debug.Log (carColor.GetColor()+"斯柯达发动了");
}
public override void Run (CarColor_AF carColor)
{
Debug.Log (carColor.GetColor()+"斯柯达跑起来了");
}
public override void Stop (CarColor_AF carColor)
{
Debug.Log (carColor.GetColor()+"斯柯达抛锚了");
}
}
public abstract class CarColor_AF {

    public abstract string GetColor ();
}
public class ColorBlack_AF : CarColor_AF {

    public override string GetColor ()
{
return "黑色的";
}
}
public class ColorRed_AF : CarColor_AF {

    public override string GetColor ()
{
return "红色的";
}
}

最新文章

  1. highcharts的引用
  2. cento下安装elasticsearch2.4.2小记
  3. ConcurrentHashMap--锁的分段技术
  4. 2.C#中通过委托Func消除重复代码
  5. 【转】SQL SERVER日志满或过大的处理方法
  6. 用sql语句生成sqlserver数据库表的数据字典
  7. 暑假集训(3)第二弹 -----Jungle Roads(Hdu1301)
  8. PHP联合sqlserver2008使用的全过程 ( 原创 亲测)
  9. inline-block的垂直居中
  10. delphi 获取北京时间(使用XMLHTTP获取百度的时间,WebBrowser获取www.timedate.cn的时间)
  11. nginx 日志格式
  12. HDU 5726 GCD(DP)
  13. 微信小程序之----加载中提示框loading
  14. 学习笔记TF018:词向量、维基百科语料库训练词向量模型
  15. 初识Shiro
  16. idea 使用正则表达式 进行匹配替换
  17. MySQL使用AUTO_INCREMENT列的表注意事项之update自增列篇
  18. ansible的优化
  19. 《Java 程序设计》实验报告汇总
  20. Access to a protected network share using Win32 C++

热门文章

  1. MySQL学习(六)——自定义连接池
  2. js常见语法错误
  3. 基于 Token 的身份验证:JSON Web Token
  4. React 第三天
  5. 洛谷 P4147 玉蟾宫 (最大子矩形问题)
  6. 紫书 习题 8-23 UVa 1623 (set妙用 + 贪心)
  7. [Luogu]P3338 [ZJOI2014]力(FFT)
  8. react添加右键点击事件
  9. linux的一页是多大
  10. 程序员之---C语言细节12(指针和数组细节,"//"的可移植性说明)