一.抽象工厂模式的定义:

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

二.抽象工厂模式的结构:

抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。

抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。

应用场景:一个生产集团,在北京的工厂需要生产A类汽车,A类电视;在上海的工厂需要生产B类汽车,A类电视。而在广州的工厂需要生产C类汽车,C类电视。

我们可以使用抽象工厂,抽象出工厂类,和产品类,然后继承工厂类,生产所需要的具体产品类型,产品继承抽象出来的产品,实现里面的行为方法。

1.我们抽象出Car产品和TV产品:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace ProductEntity
  6. {
  7. /// <summary>
  8. /// 抽象汽车产品
  9. /// </summary>
  10. public abstract class Car
  11. {
  12. public abstract void Build();
  13. }
  14. }
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace ProductEntity
  6. {
  7. /// <summary>
  8. /// 抽象TV产品
  9. /// </summary>
  10. public abstract class TV
  11. {
  12. public abstract void work();
  13. }
  14. }

2.继承自抽象出来的产品类,实现里面的方法,成为具体产品:这里只举例Acar和TVA的,后面的Bcar,Ccar,TVB,TVC,类似。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace ProductEntity
  6. {
  7. public class CarA:Car
  8. {
  9. public override void Build()
  10. {
  11. Console.WriteLine("CarA");
  12. }
  13. }
  14. }
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace ProductEntity
  6. {
  7. public class TVA : TV
  8. {
  9. public override void work()
  10. {
  11. Console.WriteLine("TVA");
  12. }
  13. }
  14. }

3.抽象出工厂类,里面有待实现创建产品的方法:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using ProductEntity;
  6. namespace FactoryMeth
  7. {
  8. /// <summary>
  9. /// 抽象生产工厂
  10. /// </summary>
  11. public abstract class AbstractFactory
  12. {
  13. /// <summary>
  14. /// 生产TV产品
  15. /// </summary>
  16. /// <returns></returns>
  17. public abstract TV newTV();
  18. /// <summary>
  19. /// 生产Car类产品
  20. /// </summary>
  21. /// <returns></returns>
  22. public abstract Car newCar();
  23. }
  24. }

4.创建具体的工厂类,继承自抽象出来的工厂,实现里面创建具体产品的方法。例:后面的B工厂,和C工厂类似实现。

  1. using ProductEntity;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. namespace FactoryMeth
  7. {
  8. /// <summary>
  9. /// A工厂
  10. /// </summary>
  11. public class AbstractFactoryA:AbstractFactory
  12. {
  13. /// <summary>
  14. /// 生产A品牌电视
  15. /// </summary>
  16. /// <returns></returns>
  17. public override TV newTV()
  18. {
  19. return new TVA();
  20. }
  21. /// <summary>
  22. /// 生产A品牌汽车
  23. /// </summary>
  24. /// <returns></returns>
  25. public override Car newCar()
  26. {
  27. return new CarA();
  28. }
  29. }
  30. }
  1. using ProductEntity;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. namespace FactoryMeth
  7. {
  8. /// <summary>
  9. /// B工厂生
  10. /// </summary>
  11. public class AbstractFactoryB:AbstractFactory
  12. {
  13. /// <summary>
  14. /// 生产B品牌电视
  15. /// </summary>
  16. /// <returns></returns>
  17. public override TV newTV()
  18. {
  19. return new TVB();
  20. }
  21. /// <summary>
  22. /// 生产A品牌汽车
  23. /// </summary>
  24. /// <returns></returns>
  25. public override Car newCar()
  26. {
  27. return new CarA();
  28. }
  29. }
  30. }
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using ProductEntity;
  6. namespace FactoryMeth
  7. {
  8. public class AbstractFactoryC:AbstractFactory
  9. {
  10. /// <summary>
  11. /// 生产C品牌电视
  12. /// </summary>
  13. /// <returns></returns>
  14. public override TV newTV()
  15. {
  16. return new TVC();
  17. }
  18. /// <summary>
  19. /// 生产C品牌汽车
  20. /// </summary>
  21. /// <returns></returns>
  22. public override Car newCar()
  23. {
  24. return new CarC();
  25. }
  26. }
  27. }

5.调用,根据具体情况进行选择,现在是在哪一个工厂,就创建该工厂:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using FactoryMeth;
  6. using ProductEntity;
  7. namespace 抽象工厂模式
  8. {
  9. class Program
  10. {
  11. static void Main(string[] args)
  12. {
  13. AbstractFactory factorysubA = new AbstractFactoryA();
  14. TV t = factorysubA.newTV();
  15. Car c = factorysubA.newCar();
  16. Console.WriteLine("A工厂生产:");
  17. t.work();
  18. c.Build();
  19. AbstractFactory factorysubB = new AbstractFactoryB();
  20. t = factorysubB.newTV();
  21. c = factorysubB.newCar();
  22. Console.WriteLine("B工厂生产:");
  23. t.work();
  24. c.Build();
  25. AbstractFactory factorysunC = new AbstractFactoryC();
  26. t = factorysunC.newTV();
  27. c = factorysunC.newCar();
  28. Console.WriteLine("C工厂生产:");
  29. t.work();
  30. c.Build();
  31. Console.Read();
  32. }
  33. }
  34. }

总结:以后如果该集团需要增加新的工厂,制造其他类型的产品,就只需要增加具体工厂类,和产品类,并实现具体产品即可。

           其实工厂和抽象工厂没有多大区别,只不过是抽象工厂生产的商品是多个而已
           通俗的说,就是抽象工厂模式的具体工厂里面会有多个实例具体对象的方法
           更直观的就是,抽象工厂模式每个工厂一次造多个产品,而工厂模式的每个工厂只造一个产品

【C#设计模式-抽象工厂模式】的更多相关文章

  1. 设计模式——抽象工厂模式及java实现

    设计模式--抽象工厂模式及java实现 设计模式在大型软件工程中很重要,软件工程中采用了优秀的设计模式有利于代码维护,方便日后更改和添加功能. 设计模式有很多,而且也随着时间在不断增多,其中最著名的是 ...

  2. 5. 星际争霸之php设计模式--抽象工厂模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  3. JAVA设计模式--抽象工厂模式

    抽象工厂设计模式 1.系统中有多个产品族,而系统一次只可能消费其中一族产品2.同属于同一个产品族的产品以其使用.来看看抽象工厂模式的各个角色(和工厂方法的如出一辙):抽象工厂角色: 这是工厂方法模式的 ...

  4. 深入浅出设计模式——抽象工厂模式(Abstract Factory)

    模式动机在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法也具有唯一性,一般情况下,一个具体工厂中只有一个工厂方法或者一组重载的工厂方法.但是有时候我们需要一个工厂可 ...

  5. 24种设计模式--抽象工厂模式【Abstract Factory Pattern】

    女娲造人,人是造出来了,世界是热闹了,可是低头一看,都是清一色的类型,缺少关爱.仇恨.喜怒哀乐等情绪,人类的生命太平淡了,女娲一想,猛然一拍脑袋,忘记给人类定义性别了,那怎么办?抹掉重来,然后就把人类 ...

  6. C++设计模式——抽象工厂模式

    问题描述 之前讲到了C++设计模式——工厂方法模式,我们可能会想到,后期产品会越来越多了,建立的工厂也会越来越多,工厂进行了增长,工厂变的凌乱而难于管理:由于工厂方法模式创建的对象都是继承于Produ ...

  7. 设计模式 | 抽象工厂模式(abstract factory)

    定义: 提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类. 结构:(书中图,侵删) 这个图相对来说有一点点复杂,其实就是在工厂方法模式的基础上做了一些扩展,工厂方法模式只用于生成一种 ...

  8. 设计模式 — 抽象工厂模式(Abstract Factory)

    工厂模式已经分析了简单工厂模式和工厂方法模式.并且了解了工厂方法模式去简单工厂模式的延伸,工厂方法模式如果不把工厂类抽象的话,就是简单工厂模式.由前面两个工厂模式可以猜测出抽象工厂模式应该是这两种工厂 ...

  9. 设计模式--抽象工厂模式C++实现

    抽象工厂模式C++实现 1定义 为创建一组相关或者依赖的对象提供一个接口,且无需指定他们的具体类 2类图 3实现 class AbstractProduct { protected: Abstract ...

  10. C#设计模式--抽象工厂模式(创建型模式)

    一.抽象工厂模式: 在工厂模式中具体的产品和具体的工厂是一一对应的,一个工厂只能生产一种产品,结构单一,例如小米公司刚开始是只生产小米手机,但是伴随着公司的发展,他们需要生产不同型号的手机,也会生产路 ...

随机推荐

  1. 实验6 LCD接口

    1.利用单片机控制LCD1602,在LCD1602上显示字符串,并使其整屏左移. #include<reg51.h> #define uchar unsigned char #define ...

  2. WPF DataGrid分组和排序

    之前一直用的Dev的GridControl,控件自带分组排序啥的.今天试了下在wpf自带的Datagrid控件上实现分组和排序. Datagrid上实现这些功能主要用到CollectionViewSo ...

  3. 前端基础-html 字体标签,排版标签,超链接,图片标签

    主要内容: 字体标签: h1~h6.<font>.<u>.<b>.<strong><em>.<sup>.<sub> ...

  4. JAVA JDK的安装及初步试用

    1.进入浏览器输入下图网址进入相关页面 2.网站主界面如图  3.单击箭头所指功能块 4.选择如下图的对应选项 5.进入如下页面后单击下图红色框 6.进入如下页面后单击如下红色框进行下载 7.下载好之 ...

  5. async await 的执行

    async await的执行 注意:本次代码仅在 Chrome 73 下进行测试. start 不了解 async await 的,先去看阮一峰老师的文章async 函数. 先来看一道头条的面试题,这 ...

  6. 多条记录的同一字段组合成一个字符串 FOR XML PATH

    stuff(select ',' + fieldname from tablename for xml path('')),1,1,'') 这一整句的作用是将多行fieldname字段的内容串联起来, ...

  7. Spring WebSocket踩坑指南

    Spring WebSocket踩坑指南 本次公司项目中需要在后台与安卓App间建立一个长连接,这里采用了Spring的WebSocket,协议为Stomp. 关于Stomp协议这里就不多介绍了,网上 ...

  8. Nutch抓取流程

    nutch抓取流程注入起始url(inject).生成爬取列表(generate).爬取(fetch).解析网页内容(parse).更新url数据库(updatedb)1:注入起始url(inject ...

  9. Java 内存分配及垃圾回收机制初探

    一.运行时内存分配 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域. 这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则 ...

  10. puppet的使用:ERB模板介绍

    ERB介绍 全称是Embedded RuBy,意思是嵌入式的Ruby,是一种文本模板技术,用过JSP的话,会发现两者语法很像. 我们项目中一般用ERB来产生各模块的配置文件.ERB模板也可以用来产生W ...