抽象工厂模式

模式动机与定义

模式动机

产品等级结构:产品等级结构即产品的继承结构,例如一个抽象类是电视机,其子类有海尔电视机、海信电视机、TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体品牌的电视机是其子类。

产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,例如海尔电器工厂生产的海尔电视机、海尔电冰箱,海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中。

模式定义

抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。

模式结构与分析

模式结构

抽象工厂模式包含如下角色:

AbstractFactory:抽象工厂

ConcreteFactory:具体工厂

AbstractProduct:抽象产品

ConcreteProduct:具体产品

模式分析

模式实例与解析

模式实例

电器工厂:实例说明

一个电器工厂可以生产多种类型的电器,如海尔工厂可以生产海尔电视机、海尔空调等,TCL工厂可以生产TCL电视机、TCL空调等,相同品牌的电器构成一个产品族,而相同类型的电器构成了一个产品等级结构,现使用抽象工厂模式模拟该场景。

电器工厂:参考类图

电器工厂:参考代码

代码结构

Television接口

package abstractfactory;

public interface Television {

public void play();

}

HaierTelevision类

package abstractfactory;

public class HaierTelevision implements Television {

@Override

public void play() {

System.out.println("海尔电视机播放中···");

}

}

TCLTelevision类

package abstractfactory;

public class TCLTelevision implements Television {

@Override

public void play() {

System.out.println("TCL电视机播放中···");

}

}

AirConditioner接口

package abstractfactory;

public interface AirConditioner {

public void changeTemperature();

}

HaierAirConditioner类

package abstractfactory;

public class HaierAirConditioner implements AirConditioner {

@Override

public void changeTemperature() {

System.out.println("海尔空调温度改变中···");

}

}

TCLAirConditioner类

package abstractfactory;

public class TCLAirConditioner implements AirConditioner {

@Override

public void changeTemperature() {

System.out.println("TCL空调温度改变中···");

}

}

EFactory接口

package abstractfactory;

public interface EFactory {

public Television produceTelevision();

public AirConditioner produceAirConditioner();

}

HaierFactory类

package abstractfactory;

public class HaierFactory implements EFactory {

@Override

public Television produceTelevision() {

return new HaierTelevision();

}

@Override

public AirConditioner produceAirConditioner() {

return new HaierAirConditioner();

}

}

TCLFactory类

package abstractfactory;

public class TCLFactory implements EFactory {

@Override

public Television produceTelevision() {

return new TCLTelevision();

}

@Override

public AirConditioner produceAirConditioner() {

return new TCLAirConditioner();

}

}

AbstractFactoryconfig.xml

abstractfactory.HaierFactory

XMLUtil类

package abstractfactory;

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 java.io.File;

public class XMLUtil {

//该方法用于从XML配置文件中提取具体类类名,并返回一个实例对象

public static Object getBean(){

try {

//创建文档对象

DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();

DocumentBuilder builder = dFactory.newDocumentBuilder();

Document doc;

doc = builder.parse(new File("D:\\MyNewWorld\\Study_JAVA\\MyHome\\Write_java\\My_Maven\\src\\main\\resources\\AbstractFactoryconfig.xml"));

//获取包含类名的文本节点

NodeList n1 = doc.getElementsByTagName("className");

Node classNode = n1.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;

}

}

}

Client类

package abstractfactory;

public class Client {

public static void main(String[] args) {

try{

EFactory factory;

Television tv;

AirConditioner ac;

factory = (EFactory) XMLUtil.getBean();

tv = factory.produceTelevision();

tv.play();

ac = factory.produceAirConditioner();

ac.changeTemperature();

}catch (Exception e){

System.out.println(e.getMessage());

}

}

}

运行结果

模式效果与应用

抽象工厂模式优点:

隔离了具体类的生成,使得客户端并不需要知道什么被创建

当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象

增加新的产品族很方便,无需修改已有系统,符合开闭原则

抽象工厂模式缺点:

增加新的产品等级结构麻烦,需要对原有系统进行较大的修改,甚至需要修改抽象层代码,这显然会带来较大的不便,违背了开闭原则。

在以下情况下可以使用抽象工厂模式:

一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节

系统中有多于一个的产品族,但每次只使用其中某一产品族

属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来。

产品等级结构稳定,在设计完成之后不会向系统中增加新的产品等级结构或者删除已有的产品等级结构。

java不同工厂生产不同电器_完整案例分析再加知识整合——艾特抽象工厂模式,超详细的...相关推荐

  1. java fgc时间过长_性能案例分析 | 一个频繁fgc问题

    今天分享一个频繁fgc的问题,现象是接口响应时间太长了,达到了好几秒,远远高于预期的1秒. 01.监控 xshell连接到应用服务器,服务器负载高,且cpu使用率也偏高 使用jstat看了下gc的情况 ...

  2. ArcGIS for Desktop入门教程_第四章_入门案例分析 - ArcGIS知乎-新一代ArcGIS问答社区...

    原文:ArcGIS for Desktop入门教程_第四章_入门案例分析 - ArcGIS知乎-新一代ArcGIS问答社区 1 入门案例分析 在第一章里,我们已经对ArcGIS系列软件的体系结构有了一 ...

  3. html中放大镜案列,Canvas实现放大镜效果完整案例分析(附代码)

    本文主要记录 canvas 在图像.文字处理.离屏技术和放大镜特效的实现过程中使用到的api.先看下效果吧: 一张模糊的图片: 鼠标点击任意位置,产生放大效果: 哇塞~ 一个帅哥,哈哈哈哈~ 1.放大 ...

  4. Java:计算机编程语言Java的简介、安装(编程环境/工具)、学习路线(如何学习Java以及几十项代码编程案例分析)之详细攻略

    Java:计算机编程语言Java的简介.安装(编程环境/工具).学习路线(如何学习Java以及几十项代码编程案例分析)之详细攻略 目录 Java的简介 1.Java的工作原理--基于Eclipse等编 ...

  5. html放大镜原理,Canvas实现放大镜效果完整案例分析(附代码)

    本文主要记录 canvas 在图像.文字处理.离屏技术和放大镜特效的实现过程中使用到的API.先看下效果吧: 一张模糊的图片: 鼠标点击任意位置,产生放大效果: 哇塞~ 一个帅哥,哈哈哈哈~ 1.放大 ...

  6. JAVA工厂模式优缺点_简单工厂模式、工厂模式和抽象工厂模式区别及优缺点

    各位小伙伴好,今天给大家主要介绍一下简单工厂模式.工厂模式和抽象工厂模式的区别及各自的优缺点. (本文实现语言为Python3) [前言] 众所周知今天所讲的内容是 设计模式的一类:对于设计模式这个概 ...

  7. 结合案例深入解析:抽象工厂模式

    一.基本概念 当涉及到产品族的时候,就需要引入抽象工厂模式了. 每一个模式都是针对一定问题的解决方案.抽象工厂模式与工厂方法模式的最大区别就在于,工厂方法模式针对的是一个产品等级结构:而抽象工厂模式则 ...

  8. 抽象工厂模式(JAVA反射)

    实例代码(JAVA):模式动机 在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法也具有唯一性,一般情况下,一个具体工厂中只有一个工厂方法或者一组重载的工厂方法.但是 ...

  9. Java设计模式-工厂方法模式和抽象工厂模式

    工厂方法模式定义: 即定义一个创建对象的接口(即抽象工厂类),让其子类(具体工厂类)决定实例化哪一个类(具体产品类)."一对一"的关系 1,一抽象工厂类派生出多个具体工厂类: 2, ...

最新文章

  1. 第十六周程序阅读(7)
  2. 农用地包括哪些地类_征用土地公告应当包括哪些内容?|楹庭拆迁律师
  3. Luogu P1654 OSU! | 期望
  4. webrtc 实现web端对端视频
  5. 不是技术也能看懂容器技术与容器平台
  6. 资本寒冬,这十大创业公司值得尊重(上)
  7. Not enough memory. Please load a smaller dataset or use larger heap size.
  8. Windows Mobile和Wince下使用TinyXML进行Native C++的开发
  9. c++关联容器的成员函数find的一个例子
  10. 图解SQL的inner join、left join、right join、full outer join、union、union all的区别
  11. ie8浏览器自定义工具栏设置教程
  12. Flutter MouseRegion 链接高亮显示样式 只有你想不到 没有你做不到的
  13. BZOJ3653 洛谷3899:谈笑风生——题解
  14. activereports_报表 ActiveReports 迎来 .Net Core 时代!一键创建 .Net Core 项目
  15. 如何用好埋点中的数据
  16. 【java笔记】自定义异常
  17. 基于Java的webapp_第一个 JAVA WEB 应用
  18. 一个cp命令引发的mongodb大量慢查询
  19. html图片闪现循环效果,CSS实现图片无缝无限循环展示效果
  20. double cbrt(double x)

热门文章

  1. java线程间通信管道_通过管道进行线程间通信
  2. Django链接数据库步骤
  3. 如何给“物联网小白”讲清楚什么是无线通信模块?很简单,会打电话就行~
  4. iOS开发-简单解析JSON数据
  5. 编程之美:无差错二分查找
  6. 易宝典文章——如何将PST文件导入到Exchange 2010 的邮箱
  7. How to Rate a Software Developer
  8. 基于组件的.NET软件开发(1)
  9. 火遍全国的网络热梗“yyds”,创造者被判刑3年
  10. 如何写出一份优秀的软件设计文档