原文地址:http://zhangwei-david.iteye.com/blog/2187627,该文通俗易懂,实为经典!

在设计模式一书中是这样描述抽象工厂的意图的: 提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的实现类。

使用场景:一个系统要独立于它的产品创建、组合和表示时,且一个该系统提供多个产品系列,系统每次仅消费其中一个系类时可以使用抽象工厂模式。

假设现在手机厂商在生产手机(phone)的同时也生产平板(Pad)(这两个产品是一个系列,都是移动端产品),简单的定义两个产品接口

Java代码  
  1. /**
  2. *
  3. * @author zhangwei_david
  4. * @version $Id: Pad.java, v 0.1 2015年2月28日 下午4:54:33 zhangwei_david Exp $
  5. */
  6. public interface Pad {
  7. public String getBrand();
  8. }
Java代码  
  1. /**
  2. *
  3. * @author zhangwei_david
  4. * @version $Id: Phone.java, v 0.1 2015年2月28日 下午4:28:34 zhangwei_david Exp $
  5. */
  6. public interface Phone {
  7. public String getBrand();
  8. }

不同厂商生产的产品的品牌一定是不同的,定义两组具体实现类

Java代码  
  1. /**
  2. *
  3. * @author zhangwei_david
  4. * @version $Id: Ipad.java, v 0.1 2015年2月28日 下午4:55:06 zhangwei_david Exp $
  5. */
  6. public class Ipad implements Pad {
  7. /**
  8. * @see com.pattern.create.abstractFactory.product.Pad#getBrand()
  9. */
  10. @Override
  11. public String getBrand() {
  12. return "APPLE";
  13. }
  14. }
Java代码  
  1. /**
  2. *
  3. * @author zhangwei_david
  4. * @version $Id: Iphone4.java, v 0.1 2015年2月28日 下午4:35:50 zhangwei_david Exp $
  5. */
  6. public class Iphone implements Phone {
  7. private static final String BRAND = "APPLE";
  8. /**
  9. * @see com.pattern.create.abstractFactory.product.Phone#getBrand()
  10. */
  11. @Override
  12. public String getBrand() {
  13. return BRAND;
  14. }
  15. }

第二组产品:

Java代码  
  1. /**
  2. *
  3. * @author zhangwei_david
  4. * @version $Id: MiPad.java, v 0.1 2015年2月28日 下午4:55:53 zhangwei_david Exp $
  5. */
  6. public class MiPad implements Pad {
  7. /**
  8. * @see com.pattern.create.abstractFactory.product.Pad#getBrand()
  9. */
  10. @Override
  11. public String getBrand() {
  12. return "MI";
  13. }
  14. }
Java代码  
  1. /**
  2. *
  3. * @author zhangwei_david
  4. * @version $Id: MiPhone.java, v 0.1 2015年2月28日 下午4:36:50 zhangwei_david Exp $
  5. */
  6. public class MiPhone implements Phone {
  7. private static final String BRAND = "MI";
  8. /**
  9. * @see com.pattern.create.abstractFactory.product.Phone#getBrand()
  10. */
  11. @Override
  12. public String getBrand() {
  13. return BRAND;
  14. }
  15. }

通过上面两组产品可以发现,每组产品的品牌都是一致的,也就是在工厂生产的时候不可能一条生产线上生成两种不同的品牌产品(山寨除外)

定义一个抽象工厂的接口,该接口提供生产一组产品的操作

Java代码  
  1. /**
  2. *
  3. * @author zhangwei_david
  4. * @version $Id: AbstractFactory.java, v 0.1 2015年2月28日 下午4:27:57 zhangwei_david Exp $
  5. */
  6. public interface AbstractFactory {
  7. public Phone createPhone();
  8. public Pad createPad();
  9. }

有两个具体实现类:

Java代码  
  1. public class AppleFactory implements AbstractFactory {
  2. /**
  3. * @see com.pattern.create.abstractFactory.AbstractFactory#createPhone()
  4. */
  5. @Override
  6. public Phone createPhone() {
  7. return new Iphone();
  8. }
  9. /**
  10. * @see com.pattern.create.abstractFactory.AbstractFactory#createPad()
  11. */
  12. @Override
  13. public Pad createPad() {
  14. return new Ipad();
  15. }
  16. }
Java代码  
  1. public class MiFactory implements AbstractFactory {
  2. /**
  3. * @see com.pattern.create.abstractFactory.AbstractFactory#createPhone()
  4. */
  5. @Override
  6. public Phone createPhone() {
  7. return new MiPhone();
  8. }
  9. /**
  10. * @see com.pattern.create.abstractFactory.AbstractFactory#createPad()
  11. */
  12. @Override
  13. public Pad createPad() {
  14. return new MiPad();
  15. }
  16. }
Java代码  
  1. public class Client {
  2. /**
  3. *
  4. * @param args
  5. */
  6. public static void main(String[] args) {
  7. AbstractFactory appleFactory = new AppleFactory();
  8. System.out.println(appleFactory.createPad().getBrand() + " PAD");
  9. System.out.println(appleFactory.createPhone().getBrand() + " PHONE");
  10. AbstractFactory miFactory = new MiFactory();
  11. System.out.println(miFactory.createPad().getBrand() + " PAD");
  12. System.out.println(miFactory.createPhone().getBrand() + " PHONE");
  13. }
  14. }

结果:

Java代码  
  1. APPLE PAD
  2. APPLE PHONE
  3. MI PAD
  4. MI PHONE

优点:

  1. 分离了具体的类
  2. 易于更换产品系列
  3. 有利于维护产品一致性

缺点:

  1. 产品簇中难以增加新的产品

抽象工厂和工厂方法的比较:

抽象工厂和工厂方法都分离了工厂接口和具体实现,不同点是工厂方法中仅抽象一个产品,有多个产品的实现,在抽象工厂中有多个抽象产品,有多组产品实现,但是具体工厂只能提供其中一组产品!

程序设计之Java设计模式(抽象工厂模式)相关推荐

  1. 【JAVA进阶系列】JAVA 设计模式 -- 抽象工厂模式(Abstract Factory)

    [JAVA进阶系列]JAVA 设计模式 -- 抽象工厂模式(Abstract Factory) [1.1]抽象工厂模式简介 抽象工厂者模式的类结构图 AbstractProduct(抽象产品),Abs ...

  2. java设计模式---抽象工厂模式

    工厂模式在项目中是常常用到的,有人说只有大项目才会用到,小项目是体会不出来.其实使用设计模式与项目的大小没有实质性的联系.设计模式是经验的总结而不是衡量项目大小的标准. 以开发项目的DAO层为例,在项 ...

  3. Java设计模式——抽象工厂模式

    文章目录 抽象工厂 概念 优缺点 优点 缺点 适用场景 代码案例 抽象工厂 使用工厂方法模式足以应付我们可能遇到的大部分业务需求. 但是当产品种类非常多时,就会出现 大量的与之对应的工厂类,这不应该是 ...

  4. Java设计模式--抽象工厂模式

    抽象工厂模式(别名:配套) 提供一个创建一系列或相互依赖对象的接口,而无需指定它们具体的类. Abstract Factory Pattern(Another Name: Kit) Provide a ...

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

    抽象工厂模式(Abstact Factory Pattern) , 也是创建型模式之一 . 之前主要介绍了工厂方法模式 , 抽象工厂模式和工厂方法模式稍有区别 . 工厂方法模式中工厂类生产出来的产品都 ...

  6. Java设计模式(工厂模式>抽象工厂模式和原型模式)

    Java设计模式Ⅱ 1.工厂模式 1.1 简单工厂模式 1.2 工厂方法模式 2.抽象工厂模式 3.总结 4.原型模式 4.1 原型模式 4.2 浅拷贝 4.3 深拷贝 5.建造者模式 1.工厂模式 ...

  7. Java 设计模式之工厂模式(二)

    原文地址:Java 设计模式之工厂模式(二) 博客地址:http://www.extlight.com 一.背景 本篇内容是 Java 设计模式创建型模式的第二篇.上一篇主题为 <Java 设计 ...

  8. java设计模式之工厂模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

  9. Java设计模式之工厂模式篇 (转)

    Java设计模式之工厂模式篇 (转)[@more@]Java设计模式之工厂模式篇 作者:冯睿  本文选自:赛迪网 2003年03月07日 .NET.com.cn/servlets/ad?Pool=te ...

最新文章

  1. etcd、flannel的安装---单节点
  2. Python字符串基础操作
  3. php中单引号与双引号的区别
  4. katalon中REST URL占位参数动态化
  5. Oracle学习(1)——BLOCK
  6. html全屏播放一段视频,显示HTML5视频全屏(Show HTML5 Video Fullscreen)
  7. nginx之反向代理服务器
  8. ODrive踩坑(四)AS5047P-SPI绝对值磁编码器,不需每次上电校准无刷电机,直接上电可用
  9. VMworld 2016 US带来了哪些惊喜?
  10. 云之讯 亿美 短信的三方接口
  11. 抖音快闪PPT制作教程
  12. 818释放规模效能,苏宁易购全场景智慧零售迈上新台阶
  13. 你对自己的定位是什么,就能成为什么样的人(转)
  14. 北京亿阳信通java笔试题_亿阳信通笔试
  15. 电脑设置定时关机的5种方法
  16. 『转载』完全用Linux工作 王垠
  17. Tampermonkey脚本
  18. 股票指标RSI背离检测程序,附代码
  19. 电磁学中的左手定则和右手定则
  20. SQL语言数据库自学整理1:聚合函数(Aggregate Founction) 2022.3.8

热门文章

  1. Dreamhost初次使用感受
  2. 关于ftp的文件批量下载(包括文件夹和文件)的多种方法
  3. 百度不收录原因分析——Spider抓取篇
  4. 数据库 SQL Server 视图 创建视图 查询视图 修改视图 删除视图
  5. 易基因: oxRRBS+RRBS揭示炎症性肠病导致发育异常的表观遗传机制|甲基化研究
  6. 【转】SVG矢量图技术
  7. oracle rac 快速闪回区 路径,oracle 10g rac配置闪回恢复区 开启归档
  8. Windows远程桌面登录不进去的可能原因
  9. 我为自己“带盐”——博客之星,感谢有你!
  10. 今日油价接口 全国省市今日油价数据实现