工厂方法模式与抽象工厂模式,两个模式比较相似,把任何一个独立出来,好像都不太好,所以把它们放到一起来理解会更好。不管是工厂方法还是抽象工厂,都有三个要素,那就是Client,Factory,Product。
首先看一下工厂方法模式:
定义一个创建对象的接口,然后把对象的创建放到子类中进行。也就是说,我们要定义一个IFactory(可以是类,抽象类,也可以是接口),然后有一些具体的Factory继承自它,如AFactory,BFactory等。然后Product的创建就放到AFactory或BFactory来实现。注意这里,一个Factory只生产一种Product,这一点很重要。一个现实的例子就是,假如我们(Client)要配一台电脑(主机PC+显示器Screen),我们就要去不同的厂家(IFactory)去购买。过程为:
Client à Factory à Product à Client。我们用代码表示如下:
    9     public class Product
   10     {
   11         //...
   12     }
   13     public class PC : Product
   14     {
   15         //...
   16     }
   17     public class  Screen : Product
   18     {
   19         //...
   20     }
   21     public interface  IFactory
   22     {
   23         Product CreateProduct();
   24     }
   25     public class  PCFactory : IFactory
   26     {
   27         public Product CreateProduct()
   28         {
   29             return new PC();
   30         }
   31     }
   32     public class ScreenFactory : IFactory
   33     {
   34         public Product CreateProduct()
   35         {
   36             return new Screen();
   37         }
   38     }
   40     public class Client
   41     {
   42         public void BuySome()
   43         {
   44             List<IFactory> factories = new List<IFactory>();
   45             factories.Add(new PCFactory());
   46             factories.Add(new ScreenFactory());
   47 
   48             foreach (IFactory factory in factories)
   49             {
   50                 factory.CreateProduct();
   51                 //...
   52             }
   53         }
   54     }
抽象工厂模式:
上面我们曾提到,工厂方法模式是一个Factory只产生一种Product,而对抽象工厂模式来说,就是一个工厂生产多种Product。也就是说这个时候Product已经不是一种了,而是多种。一句话,就是由一个工厂(Factory)生产不同的产品(Product)来满足Client的需求。
代码如下:
    9     public class PCProduct
   10     {
   11         //...
   12     }
   13     public class ScreenProduct
   14     {
   15 
   16     }
   17     public class APC : PCProduct
   18     {
   19         //...
   20     }
   21     public class BPC : PCProduct
   22     {
   23         //...
   24     }
   25     public class  AScreen : ScreenProduct
   26     {
   27         //...
   28     }
   29     public class  BScreen : ScreenProduct
   30     {
   31         //...
   32     }
   33     public interface  IFactory
   34     {
   35         PCProduct CreatePCProduct();
   36         ScreenProduct CreateScreenProduct();
   37 
   38     }
   39     public class  AFactory : IFactory
   40     {
   41         public PCProduct CreatePCProduct()
   42         {
   43             return new APC();
   44         }
   45 
   46         public ScreenProduct CreateScreenProduct()
   47         {
   48             return new AScreen();
   49         }
   50     }
   51     public class BFactory : IFactory
   52     {
   53         public PCProduct CreatePCProduct()
   54         {
   55             return new BPC();
   56         }
   57 
   58         public ScreenProduct CreateScreenProduct()
   59         {
   60             return new BScreen();
   61         }
   62     }
   63 
   64     public class Client
   65     {
   66         public void BuySome()
   67         {
   68             List<IFactory> factories = new List<IFactory>();
   69             factories.Add(new AFactory());
   70             factories.Add(new BFactory());
   71 
   72             foreach (IFactory factory in factories)
   73             {
   74                 factory.CreatePCProduct();
   75                 factory.CreateScreenProduct();
   76                 //...
   77             }
   78         }
   79     }
从上面代码,我们可以看出,从工厂方法到抽象工厂,他的变化,就在于Product由一种变成了多种,而Factory由生产一种产品变成了多种,虽然看似很小的变化,但产生的意义是很大的。
对比工厂方法,抽象工厂的意义" 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类",我们发现,抽象工厂的对象加了形容词"一系列相关或相互依赖"。
根据他们的意义,我们可以推测他们的适用性,也就是哪里可以使用,在这里就不再叙述。
原文出自:[url]http://www.cnblogs.com/myg2006/archive/2008/02/20/1075257.html[/url]

转载于:https://blog.51cto.com/yqsshr/141009

每周一个设计模式之工厂方法与抽象工厂相关推荐

  1. 设计模式:简单工厂、工厂方法、抽象工厂之小结与区别

    简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式.其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性. 本文是本人对这三种模式学习后的一个小结以及对他 ...

  2. Java设计模式—工厂方法模式抽象工厂模式

    工厂方法模式与抽象工厂模式都是设计模式中重要而且常见的模式.       工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 通用类图如下: 在 ...

  3. 【设计模式实战】简单工厂、工厂方法、抽象工厂:原理篇

    小明开发的应用,经常要从XML或者Asset中读取省市区数据. 小明是这样写的: public abstract class IOHandler {/*** 添加*/public abstract v ...

  4. 设计模式:工厂方法与抽象工厂模式

    说明:这篇blog写的很好,有助于理解工厂方法与抽象工厂模式的联系与区别. 原文链接:http://blog.csdn.net/yzxz/article/details/4601152 抽象工厂模式与 ...

  5. 研磨23种大话设计模式------简单工厂模式 + 工厂方法模式 + 抽象工厂模式

    大家好,我是一位在java学习圈中不愿意透露姓名并苟且偷生的小学员,如果文章有错误之处,还望海涵,欢迎多多指正 如果你从本文 get 到有用的干货知识,请帮忙点个赞呗,据说点赞的都拿到了offer 简 ...

  6. 2.5万字详解23种设计模式—创建型模式(简单工厂、工厂方法、抽象工厂、单例-多线程安全详解、建造者、原型)的详细解读、UML类图

    本文简述了各大设计模式,并通过UML和代码详细说明.本文大约共 2.5W 字,建议收藏.下方是本文的目录: 一.设计模式的认识 二.设计模式的分类 根据其目的 根据范围 三.设计模式的优点 四.设计模 ...

  7. Android工厂设计模式(简单工厂,工厂方法,抽象工厂,BitmapFactory简单工厂分析,Retrofit抽象工厂分析)

    文章目录 创建型设计模式(简单工厂,工厂方法,抽象工厂) 一.简单工厂模式 引出简单工厂模式 二.工厂方法模式 三.抽象工厂模式 Android源码中用到的工厂模式举例 一.BitmapFactory ...

  8. 设计模式——简单工厂、工厂方法和抽象工厂的区别与联系

    前言 创建型模式中,常用的有工厂方法模式和抽象工厂模式,平时实践还包括简单工厂模式,虽然简单工厂模式不在23种设计模式中. 为了区分以上几种设计模式的差别,通过以下几个例子介绍这几种模式的使用场景以及 ...

  9. java 抽象工厂工厂_Java设计模式之简单工厂、工厂方法和抽象工厂

    学习Java的同学注意了!!! 学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:456544752我们一起学Java! 在前面的学习中(参见前面的博客),我们学到了很 ...

最新文章

  1. ggplot2笔记7:定位(分面和坐标系)
  2. 使用 Firefox攻击Web2.0应用(二)
  3. java 连接redis失败_java 连接Redis问题及demo
  4. h5实现手机端等级进度条
  5. Android Kernel Features
  6. 直播笔记 | Unity中射线检测详解
  7. css手型指针_前端基础面试题(HTML+CSS部分)
  8. Android 4G 模块添加 TV平台Mstar HISI
  9. shader篇-漫反射
  10. Parallel GC
  11. Mysql占用CPU过高排查过程及可能优化方案
  12. (随笔备忘)装系统—— centos7下制作U盘启动盘还是失败待试,换大白菜
  13. GDG深圳站,我又来了~
  14. 在声学技术这件事上,小米MIX 怎么就黑科技了?
  15. java单例实例对象在springboot中实例化了2次,原因竟然是热部署的锅(记一次神奇的bug)
  16. 论文写作 4: 彻底解决英文句子的语法问题 (好的中文 = 好的英文)
  17. AspectJ与CGLIB
  18. 【Vue3】vue3全解
  19. ai电销机器人系统搭建开发-通话模块
  20. java 文字旋转_Java2D特效 文字旋转

热门文章

  1. 使用Xshell密钥认证远程登录linux
  2. 在Linux上安装Chef工作站
  3. 鼠标点到某个位置出现手势的效果。
  4. 用socket发送流数据示--用 php://input? 接受post数据(可实现php和c/c++数据通讯)
  5. 如何对CentOS FTP服务配置 - 51CTO.COM
  6. VueJs入门(一)
  7. 【HNOI 2016】序列
  8. 2018 Python 开发者调查报告发布,数据出乎你意料吗?
  9. XCode SDK接入时提示: UIApplicationInvalidInterfaceOrientation
  10. python 微信公众号-回调模式验证url