设计模式 - 抽象工厂模式案例

  • 抽象工厂模式vs工厂方法模式
  • 引入两个概念
    • 产品等级结构
    • 产品族
  • 模式结构的角色
  • 抽象工厂模式案例
    • 案例背景
    • 案例分析
    • 实现步骤
    • 代码实现(按顺序)
      • 文件结构/类图
      • 1. 抽象产品类(2个)
      • 2. 具体产品类(4个)
      • 3. 抽象工厂(1个)
      • 4. 具体工厂(2个)
      • 5. 配置类(config.xml)
      • 6. 读取配置类(XMLUtil.java)
      • 7. 客户类
      • 输出结果
  • 模式适用环境

抽象工厂模式vs工厂方法模式

  1. 工厂方法模式中具体工厂只需要生产一种具体产品
  2. 抽象工厂模式中具体工厂可以生产相关的一组具体产品,这样的一组产品称为产品族

引入两个概念

产品等级结构

产品等级结构:产品的继承结构。

比如:抽象电视机和具体品牌电视之间构成了一个产品等级结构

产品族

产品族:是指由同一个工厂生产的,位于不同产品等级结构一组产品

比如:
① 海尔工厂生成的海尔电视机、海尔电冰箱。
海尔电视机、海尔电冰箱就属于同一个产品族
③ 在这里海尔电视机属于电视机产品等级结构,海尔电冰箱属于电冰箱等级结构 ,它们位于不同产品等级结构

模式结构的角色

  1. 抽象工厂

① 定义了返回具体产品对象的方法
产品有几种就定义几个方法

  1. 具体工厂

① 实现父类中 返回具体产品对象的方法
具体工厂的个数 = 产品族的个数 --> 品牌的个数

  1. 抽象产品

① 将业务方法抽象出来
抽象产品的个数 = 产品等级结构的个数 -->电视机、电冰箱 (产品类别的个数)

  1. 具体产品

① 只要指明一个产品所处的产品族,以及所属的产品等级结构,就可以唯一确定这个产品
② 实现该产品的业务方法
具体产品的个数 = 产品族个数(品牌) * 产品等级结构的个数(产品类别)
比如品牌(产品族)有两个:海尔和海信
抽象产品(产品等级结构)有两个:电视机、电冰箱
则具体产品就是2 * 2

抽象工厂模式案例

案例背景

计算机包含内存(RAM),CPU等硬件设备,根据如图所示的“产品等级结构-产品族示意图”,使用抽象工厂模式实现计算机设备创建过程并绘制类图

案例分析

  1. 产品族(即具体工厂 --> 品牌)的个数有两个:PC 和 MAC
  2. 产品等级结构(即抽象产品 --> 产品类别)的个数有两个:CPU 和 RAM

实现步骤

  1. 编写一个抽象工厂类:AbstractFactory,
    两个具体工厂:PcFactory和MacFactory ,
    两个抽象产品类:CPU,RAM,
    四个具体产品类:PcCPU,MacCPU,PcRAM,MacRAM
  2. 编写一个用户类Client和辅助类XMLUtil以实现通过XML文件来制造不同的产品
  3. 更改XML中的属性,观察用户类是否能使用不同的产品

代码实现(按顺序)

文件结构/类图

1. 抽象产品类(2个)

/*** @author 王胖子* @version 1.0*/
public interface CPU {public void play();
}
/*** @author 王胖子* @version 1.0*/
public interface RAM {public void play();
}

2. 具体产品类(4个)

一个具体工厂生产一个产品族,一个产品族里有两种产品:CPU和RAM
② 有两个具体工厂:PC工厂 和 MAC工厂
PC工厂生产 PcCPU 和 PcRAM

/*** @author 王胖子* @version 1.0*/
public class PcCPU implements CPU {@Overridepublic void play() {System.out.println("PC的CPU工作中...");}
}
/*** @author 王胖子* @version 1.0*/
public class PcRAM implements RAM {@Overridepublic void play() {System.out.println("PC的RAM工作中...");}
}
/*** @author 王胖子* @version 1.0*/
public class MacCPU implements CPU {@Overridepublic void play() {System.out.println("MAC的CPU工作中...");}
}
/*** @author 王胖子* @version 1.0*/
public class MacRAM implements RAM {@Overridepublic void play() {System.out.println("MAC的RAM工作中...");}
}

3. 抽象工厂(1个)

/*** @author 王胖子* @version 1.0*/
public interface AbstractFactory {public CPU produceCPU();public RAM produceRAM();
}

4. 具体工厂(2个)

/*** @author 王胖子* @version 1.0*/
public class PcFactory implements AbstractFactory {@Overridepublic CPU produceCPU() {return new PcCPU();}@Overridepublic RAM produceRAM() {return new PcRAM();}
}
/*** @author 王胖子* @version 1.0*/
public class MacFactory implements AbstractFactory {@Overridepublic CPU produceCPU() {return new MacCPU();}@Overridepublic RAM produceRAM() {return new MacRAM();}
}

5. 配置类(config.xml)

<?xml version="1.0"?>
<config><className>PcFactory</className>
</config>

6. 读取配置类(XMLUtil.java)

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.File;/*** @author 王胖子* @version 1.0*/
public class XMLUtil {//该方法用于从xml配置文件中提取具体类类名,并返回一个实例对象public static Object getBean() {try {//创建DOM对象DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = dFactory.newDocumentBuilder();Document doc;//这个地址从项目根目录开始读取doc = builder.parse(new File("src//config.xml"));//获取包含类名的文本节点NodeList nl = doc.getElementsByTagName("className");Node classNode = nl.item(0).getFirstChild();String cName = classNode.getNodeValue();//通过类名生成实例对象并返回Class c = Class.forName(cName);Object obj = c.newInstance();return obj;} catch (Exception e) {e.printStackTrace();return null;}}
}

7. 客户类

/*** @author 王胖子* @version 1.0*/
public class Client {public static void main(String[] args) {CPU cpu;RAM ram;AbstractFactory factory;factory = (AbstractFactory) XMLUtil.getBean();cpu = factory.produceCPU();ram = factory.produceRAM();cpu.play();ram.play();}
}

输出结果

模式适用环境

抽象工厂模式主要适用于:

  1. 一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节
  2. 系统中有多于一个的产品族,但每次只使用其中某一产品族
  3. 属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来
  4. 产品等级结构稳定,在设计完成之后不会向系统中增加新的产品等级结构或者删除已有的产品等级结构

设计模式 - 抽象工厂模式案例相关推荐

  1. 系统架构技能之设计模式-抽象工厂模式

    一.上篇回顾 上篇我们主要讲述了简单工厂模式和工厂模式.并且分析了每种模式的应用场景和一些优缺点,我们现在来回顾一下: 简单工厂模式:一个工厂负责所有类型对象的创建,不支持无缝的新增新的类型对象的创建 ...

  2. 常见设计模式—抽象工厂模式

    设计模式-抽象工厂模式 1.什么是抽象工厂模式 抽象工厂模式是围绕一个超级工厂创建其它工厂,是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品. 2.角色分 ...

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

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

  4. 徒手撸设计模式-抽象工厂模式

    概念 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. ...

  5. 设计模式-抽象工厂模式的应用场景及Java中对抽象工厂的应用

    1. 什么是抽象工厂模式 抽象工厂模式提供了一个创建一系列相关或者相互依赖对象的接口,无需指定他们的类 抽象工厂模式(Abstract Factory Pattern)隶属于设计模式中的创建型模式,用 ...

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

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

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

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

  8. C++设计模式--抽象工厂模式

    前言 前面有两篇文章分别介绍了简单工厂模式和工厂方法模式,这两种模式都比较常见,今天介绍工厂模式的最后一种,抽象工厂模式. 抽象工厂模式(Abstract Factory Pattern)是所有形态的 ...

  9. python工厂模式 理解_浅谈Python设计模式 - 抽象工厂模式

    声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 在上一篇我们对工厂模式中的普通工厂模式有了一定的了解,其实抽象工作就是 表示针对 ...

  10. 05设计模式——抽象工厂模式

    前言:以下总结来自龙哥---左潇龙博客. 总结的很到位,附上博客链接:http://www.cnblogs.com/zuoxiaolong/p/pattern6.html 抽象工厂模式算是工厂相关模式 ...

最新文章

  1. 损失函数(Loss Function) -1
  2. php 一次性替换多个关键词
  3. 运行 OpenCV-Python-Toturial-中文版 遇到的一些错误问题
  4. 计算机对英语口语考试成绩,英语口语考试人机对话得分技巧
  5. JS常用属性方法大全
  6. 怎样搭建Android开发平台(转)
  7. JAVA 实现 JWT
  8. java你画我猜源码_为什么看到Mybatis源码就感到烦躁?
  9. 信息服务器怎么恢复,服务器数据恢复怎么弄
  10. 组织需要什么样的我_为什么开放组织对我说话
  11. perl字符串数组 中 中加入点号和加入逗号效果是不一样
  12. 数据结构上机实践第四周项目1 - 建立单链表
  13. NAT,PAT、OSPF的相关配置
  14. 社区计算机考试内容,社区工作人员计算机考试大纲
  15. Excel 快捷键学习笔记
  16. webpack:Error: Compiling RuleSet failed: Exclamation mark separated loader lists has been removed
  17. 线段树进阶之lazy思想及Java实现
  18. python爬虫:批量下载qq空间里的照片(二)
  19. Magento清空购物车
  20. vim tutorial 101 hacks(三)

热门文章

  1. stl文件unity_Unity导入STL格式模型(二)
  2. DOM元素节点属性outerHTML和innerHTML
  3. 【SAM】bzoj5084: hashit
  4. 利用Meshlab进行泊松重建
  5. python输出实时时间
  6. bp神经网络简单流程包括,bp神经网络简单实例
  7. lmdb数据库的读取与转换(二) —— 数据集操作
  8. 腾讯 信鸽测试demo
  9. java单例模式——双重检查
  10. 算法 | 生命游戏 (Game of Life)