继上篇简单工厂设计模式之后,今天继续讲解抽象工厂设计模式。在简单工厂中,我们的工厂类一次只可以处理一类产品。那么如果我们想处理多类产品,简单工厂是满足不了的。必须要用抽象工厂设计模式。

我们先从概念上来了解下什么是抽象工厂设计模式:

•1、提供一系列相互依赖对象的创建工作
•2、封装对象常规的创建方法(new)
•3、提供统一调用访问方法的方式
•4、避免调用访问方法和具体对象创建工作的紧耦合
这些概念性的东西看起来比较抽象,直接上图

如上图所示,我们如何去更好的理解抽象工厂,首先 我们要分清在这个模式中的几类角色。有抽象工厂,实体工厂,抽象产品,实体产品,客户(调用代码的类)。

•抽象工厂设计模式中各个对象的主要功能、职责:
•1、用抽象工厂生产抽象产品
•2、用实体工厂生产实体产品
•3、用抽象产品提供实体产品访问接口
•4、用实体产品实现自己的功能
直接上代码:
1、定义抽象产品 (父类可以是接口或者抽象类,我们定义一个抽象类,一个接口)
定义抽象产品A:
    /// <summary>/// 抽象产品A/// </summary>public abstract class Car{public abstract void Run();}

抽象产品B:

    /// <summary>/// 抽象产品B/// </summary>public interface IBus{void Run();}

2、定义实体产品

实体产品A1:

    /// <summary>/// 实体产品A1/// </summary>public class BMWCar:Car{public override void Run(){Console.WriteLine("宝马轿车在行驶!");}}

实体产品A2:

    /// <summary>/// 实体产品A2/// </summary>public class BenzCar:Car{public override void Run(){Console.WriteLine("奔驰轿车在行驶!");}}

实体产品B1:

    /// <summary>/// 实体产品B1/// </summary>public class BMWBus : IBus{public void Run(){Console.WriteLine("宝马大汽车");}}

实体产品B2:

    /// <summary>/// 实体产品B2/// </summary>public class BenzBus : IBus{public void Run(){Console.WriteLine("奔驰大汽车");}}

我们甚至可以再建N个A3,A4,B3,B4.................... 此处省略。

3、定义抽象工厂

众所周知现实生活中工厂都是生产产品的,在我们这 工厂是用来生产类的对象的。抽象工厂就是用来定义 工厂应该做什么的。相当于工厂接口规定工厂应该做什么。同时创建实体工厂对象,创建对象可以用反射,本例中只是为了说明抽象工厂的思想和具体实现。我们直接使用配置文件来读取。

    /// <summary>/// 抽象工厂/// </summary>public abstract class AbstractFactory{public static AbstractFactory CreateFactory(string strType){AbstractFactory factory = null;switch (strType){case "BMW":factory = new BMWFactory();break;case "Benz":factory = new BenzFactory();break;}return factory;}/// <summary>/// 抽象方法 创建Car对象/// </summary>/// <returns></returns>public abstract Car CreateCar();/// <summary>/// 创建BUS/// </summary>/// <returns></returns>public abstract IBus CreateBus();}

4、定义实体工厂

实体工厂1:

   /// <summary>/// 实体工厂1/// </summary>public class BMWFactory:AbstractFactory{public override Car CreateCar(){return new BMWCar();}public override IBus CreateBus(){return new BMWBus();}}

实体工厂2:

    /// <summary>/// 实体工厂2/// </summary>public class BenzFactory : AbstractFactory{public override Car CreateCar(){return new BenzCar();}public override IBus CreateBus(){return new BenzBus();}}

5、客户端调用

从 最上面的图我们可以看出客户端调用抽象工厂的代码只关注抽象工厂和抽象产品,而不关注具体的实现类。如下图:

由此我们得出抽象工厂的定义:

提供一个创建一系列相关或相互依赖对象的接口,无需指定它们具体的类
 static void Main(string[] args){AbstractFactory factory = AbstractFactory.CreateFactory("Benz");Car car = factory.CreateCar();car.Run();IBus bus = factory.CreateBus();bus.Run();}

直接上代码:

点我下载

转载于:https://www.cnblogs.com/suizhouqiwei/archive/2012/06/26/2563332.html

设计模式之二抽象工厂设计模式相关推荐

  1. 抽象工厂和工厂方法示例_抽象工厂设计模式示例

    抽象工厂和工厂方法示例 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此 ...

  2. 抽象工厂设计模式示例

    本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此重要的原因,并了解何时以 ...

  3. 创建设计模式 - 抽象工厂设计模式

    创建设计模式 - 抽象工厂设计模式 欢迎来到java示例中的Abstract Factory Design Pattern.摘要工厂设计模式是创造模式之一.抽象工厂模式几乎类似于工厂模式,除了它更像工 ...

  4. c++的抽象工厂设计模式

    首先工厂设计模式分好多种,简单工厂设计模式,方法工厂设计模式,抽象工厂设计模式 今天主要介绍的是抽象工厂设计模式: 分析: 所谓工厂:用来生产产品:所谓抽象:将共同点提出来形成接口. 1>首先要 ...

  5. java设计抽象英雄类_java抽象工厂设计模式之游戏实例解析(大话java英雄联盟)...

    # 原创作品,转载请注明出处,谢谢!@杨福星 (http://blog.csdn.net/luckystar92/article/details/52176737) *前言: 最近在学习抽象工厂设计模 ...

  6. 工厂设计模式、简单工厂设计模式、抽象工厂设计模式

    一.简单工厂设计模式.工厂设计模式,抽象工厂设计模式总体分析 简单工厂模式 简单工厂模式不是23种里的一种,简而言之,就是有一个专门生产某个产品的类. 比如下图中的鼠标工厂,专业生产鼠标,给参数0,生 ...

  7. 设计模式C#描述——抽象工厂模式

    设计模式C#描述--抽象工厂模式 阅读此文应先阅读简单工厂模式与工厂方法模式 抽象工厂模式是对象的创建模式,它是工厂方法模式的进一步推广. 假设一个子系统需要一些产品对象,而这些产品又属于一个以上的产 ...

  8. 用C# (.NET Core) 实现抽象工厂设计模式

    本文的概念性内容来自深入浅出设计模式一书.上一篇文章讲了简单工厂和工厂方法设计模式 使用的是披萨店的例子. 文将继续使用这个例子, 这里要用到抽象工厂. 披萨店的需求变更 现在披萨店在各地授权了很多连 ...

  9. 抽象工厂模式设计模式_抽象工厂设计模式解释

    抽象工厂模式设计模式 抽象工厂设计模式是工厂设计模式的另一种形式. 这种模式可以被视为"超级工厂"或"工厂工厂". 抽象工厂设计模式(属于"四人帮&q ...

最新文章

  1. 从PyTorch到ONNX的端到端AlexNet
  2. JS获取DOM元素的八种方法
  3. 1.26 Java使用自定义包
  4. 计算机网络原理_第8章 局域网技术 之二 令牌环
  5. mac VMware fusion配置nat网络
  6. 推荐电影 梦工厂经典电影列表 1996-2012
  7. 金山词霸2009牛津版(Sp1破解补丁)
  8. 搜狗输入法取消英文空格确认
  9. 嫡权法赋权法_Python实现客观赋权法
  10. 2015-2016 ACM-ICPC, NEERC, Moscow Subregional Contest G题: Garden Gathering [线段树/最小曼哈顿距离生成树]
  11. 安信证券资管清算重要业务在原生分布式数据库的创新实践
  12. 开源office办公套件
  13. 网络攻防实验:defcon2015 r0pbab
  14. iPad pro 显示器
  15. 测试最常见的21个故障模型
  16. Linux源码编译-编译哪些设备树
  17. 5h是什么意思_鱼杆5H什么意思?
  18. Bio::DB::GenBank, Bio::SeqIO
  19. 绿盟安全事件响应观察漏洞频繁爆发
  20. abb变频器580系列改中文_ABB变频器ACQ580A介绍

热门文章

  1. 用bat-抓取android日志
  2. linux pdm 查看工具,linux系统监控工具
  3. 摇杆控制方向原理_为工业安全守好”门”!各种方向的控制阀原理图大集合
  4. ps绿化工具_绿化消防车价位
  5. java可达性_java垃圾回收机制--可达性算法
  6. 表格字体缩小 php_如何快速找出两个Excel表格不同的地方?
  7. LeetCode 642. 设计搜索自动补全系统(Trie树)
  8. LeetCode 1465. 切割后面积最大的蛋糕
  9. LeetCode 1219. 黄金矿工(回溯)
  10. linux发指令给网络设备,Linux学习笔记五(网络命令)