一、 实验目的与要求

1.练习使用工厂模式。设计相关的模拟场景并进行实施,验证模式特性,掌握其优缺点。
2.实验结束后,对相关内容进行总结。

二、实验内容

1.模式应用场景说明

作为一个青年人,最好的伙伴就是手机。而手机最重要的就是手机的CPU。两家公司Huawei和Apple要寻找一个代工厂。但是由于光刻机数量不足,因此,同一时间只允许有一种类型的CPU进行生产。可以修改外部配置文件,可以控制不同的CPU的生产。

2.应用场景类图

3.实现代码与解释

3.1抽象产品类

package 工厂模式;
public interface CPU {public void play();
}

3.2具体产品类HuaweiCPU

package 工厂模式;public class HuaweiCPU implements CPU {@Overridepublic void play() {System.out.println("Huawei的CPU生产中...");}
}

3.3具体产品类 AppleCPU

package 工厂模式;public class AppleCPU implements CPU {public void play() {System.out.println("Apple的CPU生产中...");}
}

3.4 抽象工厂类CPUFactory

package 工厂模式;public interface CPUFactory {public CPU produceCPU();
}

3.5具体工厂类HuaweiFactory

package 工厂模式;public class HuaweiFactory implements CPUFactory {public CPU produceCPU() {System.out.println("华为手机工厂生产华为CPU");return new HuaweiCPU();}
}

3.6具体工厂类AppleFactory

package 工厂模式;public class AppleFactory implements CPUFactory{public CPU produceCPU() {System.out.println("苹果手机工厂生产苹果CPU");return new AppleCPU();}
}

3.7辅助代码:获取外界配置文件的信息

package 工厂模式;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.xml.sax.SAXException;
import java.io.*;
public class XMLUtil
{//该方法用于从XML配置文件中提取具体类类名,并返回一个实例对象public static Object getBean(){try{//创建文档对象DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = dFactory.newDocumentBuilder();Document doc;                           doc = builder.parse(new File("C:\\Users\\33132\\Desktop\\工厂模式\\工厂模式\\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;}}
}

3.8外界配置文件

4.结果及分析

4.1将配置文件节点改成AppleFactory

4.2将配置文件节点改成HuaweiFactory

三、实验总结

优点:可拓展性好,完全符合“开闭原则”。
缺点:由于考虑到系统的可拓展性,需要引入抽象层,增加了系统抽象性的理解难度。

创建型模式——工厂模式相关推荐

  1. JavaScript 设计模式核⼼原理与应⽤实践 之 创建型:工厂模式·简单工厂——区分“变与不变”

    JavaScript 设计模式核⼼原理与应⽤实践 之 创建型:工厂模式·简单工厂--区分"变与不变" 先来说说构造器 在介绍工厂模式之前,为了辅助大家的理解,我想先在这儿给大家介绍 ...

  2. JavaScript 设计模式核⼼原理与应⽤实践 之 创建型:工厂模式·抽象工厂——理解“开放封闭”

    JavaScript 设计模式核⼼原理与应⽤实践 之 创建型:工厂模式·抽象工厂--理解"开放封闭" 一个不简单的简单工厂引发的命案 在实际的业务中,我们往往面对的复杂度并非数个类 ...

  3. 设计模式(20):创建型-抽象工厂模式(Abstract Factory)

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于 ...

  4. 【创建型】工厂模式(Factory Pattern)详解

    工厂模式分为简单工厂.工厂方法.抽象工厂模式. 这一篇说一下简单工厂.工厂方法: 简单工厂 :用来生产同一等级结构中的任意产品.(不支持拓展增加产品) 工厂方法 :用来生产同一等级结构中的固定产品.( ...

  5. (创建型)设计模式——工厂模式(factory)

    ps:在以下讲述工厂模式中,模仿的场景如下:我们需要生产Car,建立相对应的CarFactory.使用CarFactory工厂来生产Car,并且可以在生产过程中进行一些处理.类图和代码如下. 1.Mo ...

  6. Java设计模式之创建型:原型模式

    一.什么是原型模式: 原型模式主要用于对象的创建,使用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象.UML类图如下: 原型模式的核心是就是原型类 Prototype,Prototype ...

  7. Java设计模式之创建型:建造者模式

    一.什么是建造者模式: 建造者模式将复杂产品的创建步骤分解在在不同的方法中,使得创建过程更加清晰,从而更精确控制复杂对象的产生过程:通过隔离复杂对象的构建与使用,也就是将产品的创建与产品本身分离开来, ...

  8. 创建型设计模模式---原型模式

    设计模式 序号 内容 链接地址 1 设计模式七大原则 https://blog.csdn.net/qq_39668819/article/details/115390615 2 创建型设计模式–工厂模 ...

  9. 创建型设计模模式---建造者模式

    设计模式 序号 内容 链接地址 1 设计模式七大原则 https://blog.csdn.net/qq_39668819/article/details/115390615 2 创建型设计模式–工厂模 ...

  10. 设计模式-创建型模式-工厂模式(工厂三兄弟) TypeScript

    设计模式-创建型模式-工厂模式(工厂三兄弟) TypeScript 简单工厂模式 定义一个接口,三个具体类.然后书写如下,通过选择,生产出相应的对象 // 定义Shape接口 interface Sh ...

最新文章

  1. 基于WINCE6.0+S3C6410通过USB下载stepldr
  2. Yacc 与 Lex 快速入门
  3. 使用 Azure DevTest Lab 搭建云端开发测试环境
  4. C++实现简单的信息管理系统
  5. oracle账号密码修改后特别容易锁定_Oracle密码过期如何取消密码180天限制及过期,账号锁住的问题...
  6. sprintboot 后端将音频流写入到前端播放_freac for mac(音频和CD格式转换器)
  7. Python推箱子小游戏源代码
  8. abaqus2017安装后启动cae报错_Abaqus2017安装全过程
  9. 文件另存为GBK编码格式
  10. 2010年山东省区县级农作物面积及产量统计数据
  11. sas 显示本地服务器,sas连接服务器local
  12. 文档损坏了怎么修复?文档修复方法分享
  13. getSreenWH()
  14. 网络安全 Windows用户密码破解 使用破解MD5值的在线网站和监听工具Cain
  15. 亚麻种子的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  16. mac 重启php-fpm
  17. Python开发Windows桌面应用程序(一)PyCharm+PyQt5开发环境搭建
  18. UE4角色受击动画,随机播放音效
  19. python学习知识点
  20. 萨尔大学计算机受限,【德国留学】留学受限专业是怎么回事?如何被受限专业录取?...

热门文章

  1. React Native之hardwareBackPress
  2. Android之jni解决JNIEnv跨线程问题
  3. C语言atoi()函数:将字符串转换成int(整数)和sprintf和memset
  4. node.js npm常用命令
  5. mysql分页原理和sqlserver里面序列的用法
  6. linux nginx线程池,nginx使用线程池提升9倍性能
  7. 计算机转财经专业考试考什么,高三对口升学第三次模拟考试财经基础课计算机专业课...
  8. 如何用c语言验证一个定理,验证动量定理方法一
  9. cvtcolor python opencv_二值分析 | OpenCV + skimage如何提取中心线
  10. 20以内究竟包不包括20?