热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

三大工厂设计模式应用总结报告,工厂设计模式的优点

一.题目分析1.题目一:简单工厂模式的应用(1)题目要求:模拟女娲造人;传入参数M,返回一个Man对象,传入参数W,返回一个Woman对象;在此实现基础上,增加一个机器人类,传入参

一.题目分析
1.题目一:简单工厂模式的应用
(1)题目要求:模拟女娲造人;传入参数M,返回一个Man对象,传入参数W,返回一个Woman对象;在此实现基础上,增加一个机器人类,传入参数R,返回一个Robot对象;实现该题目要求,并且观察女娲的变化。
(2)题目应用知识点:运用简单工厂模式编程实现
2.题目二:工厂方法模式的应用
(1)题目要求:模拟不同工厂生产空调;海尔工厂生产海尔空调,美的工厂生产美的空调。
(2)题目应用知识点:运用工厂方法模式编程实现;绘制类图
3.题目三:抽象工厂模式的应用
(1)题目要求:模拟电脑硬件生产工厂生产配件;该题中生产RAM、CPU硬件设备,品牌有Mac、Pc;如下是“产品等级结构-产品族”的示意图。
(2)题目应用知识点:运用抽象工厂模式编程实现;绘制类图

二.类图设计
1.模拟女娲造人的UML类图(简单工厂模式)

2.模拟生产空调的UML类图(工厂方法模式)

3.模拟电脑配件生产工厂生产硬件配件类图(抽象方法模式)

三.程序实现
1.简单工厂模式应用
1.1接口

public interface IPerson { void printPerson();}

1.2接口实现类
1.2.1Woman类

class Woman implements IPerson{ @Override public void printPerson() { System.out.println("女娲造出一个女生!"); }}

1.2.2Man类

class Man implements IPerson{ @Override public void printPerson() { System.out.println("女娲造出一个男生!"); }}

1.2.3Robot类

class Robot implements IPerson{ @Override public void printPerson() { System.out.println("wldfn造出来一个机器人!!!"); }}

1.3工厂类

class PersonFactory { public static IPerson getInstance(String type){ IPerson person = null; if(type.equals("W")){ person = new Woman(); }else if(type.equals("M")){ person = new Man(); }else if(type.equals("R")){ person = new Robot(); } return person; }}

1.4测试类

public class Test { public void createPerson(IPerson person){ person.printPerson(); } public static void main(String[] args) { String persontype; System.out.println("选择输入W或M或R:"); Scanner sc = new Scanner(System.in); persOntype= sc.nextLine(); IPerson person = PersonFactory.getInstance(persontype); new Test().createPerson(person); }}

2.工厂方法模式应用
2.1接口
2.1.1空调接口

public interface AirCondition { void printAirCondition();}

2.1.2空调工厂接口

public interface AirConditionFactory { AirCondition createAirCondition();}

2.2接口实现类
2.2.1HaierAirCondition类

class HaierAirCondition implements AirCondition{ @Override public void printAirCondition() { System.out.println("生产一个海尔空调..."); }}

2.2.2MideaAirCondition类

class MideaAirCondition implements AirCondition{ @Override public void printAirCondition() { System.out.println("生产一个美的空调..."); }}

2.2.3HaierFactory类

class HaierFactory implements AirConditionFactory{ @Override public AirCondition createAirCondition() { return new HaierAirCondition(); }}

2.2.4MideaFactory类

class MideaFactory implements AirConditionFactory{ public AirCondition createAirCondition() { return new MideaAirCondition(); }}

2.3测试类

public class Test { public void createAirCondition(AirCondition type){ type.printAirCondition(); } public static void main(String[] args) { AirConditionFactory airCOnditionFactory= new HaierFactory(); new Test().createAirCondition(airConditionFactory.createAirCondition()); }}

3.抽象工厂模式应用
3.1接口
3.1.1CPU接口

public interface ICPU { void printCPU();}

3.1.2RAM接口

public interface IRAM { void printRAM();}

3.1.3生产工厂接口

public interface ProductionFactory { ICPU createCPU(); IRAM createRAM();}

3.2接口实现类
3.2.1MacCPU类

public class MacCPU implements ICPU { @Override public void printCPU() { System.out.println("This is a MacCPU!"); }}

3.2.2PcCPU类

public class PcCPU implements ICPU{ @Override public void printCPU() { System.out.println("This is a PcCPU!"); }}

3.2.3MacRAM类

public class MacRAM implements IRAM{ @Override public void printRAM() { System.out.println("This is a MacRAM!"); }}

3.2.4PcRAM类

public class PcRAM implements IRAM { @Override public void printRAM() { System.out.println("This is a PcRAM!"); }}

3.2.5MacProductionFactory类

public class MacProductionFactory implements ProductionFactory { @Override public ICPU createCPU() { return new MacCPU(); } @Override public IRAM createRAM() { return new MacRAM(); }}

3.2.6PcProductionFactory类

public class PcProductionFactory implements ProductionFactory { @Override public ICPU createCPU() { return new PcCPU(); } @Override public IRAM createRAM() { return new PcRAM(); }}

3.3测试类

public class Test { public void buyCPU(ICPU cpu){ cpu.printCPU(); } public void buyRAM(IRAM ram){ ram.printRAM(); } public static void main(String[] args) { Test test = new Test(); ProductionFactory productiOnFactory= new MacProductionFactory(); ICPU cpu = productionFactory.createCPU(); IRAM ram = productionFactory.createRAM(); test.buyCPU(cpu); test.buyRAM(ram); }}

四.调试、测试及运行结果
1.题目一:
1.1当传入参数是W:

1.2当传入参数是M:

1.3当传入参数是R:

2.题目二:
2.1传入的是Haier空调对象:

2.2传入的是Midea空调对象:

3.题目三:
3.1传入的是Mac对象:

3.2 传入的是Pc对象:

五.总结
1.简单工厂模式:
(1)添加具体产品时,需要修改工厂类,违反了OCP原则;
(2)若需要添加多个具体产品时,会多次修改工厂类代码,导致工厂类体代码量不断增长,不利于日后代码维护;
(3)代码思想易于理解,代码编写简单;
2.工厂方法模式:
(1)区别于简单工厂模式,将产品类的对象实例化操作不再交给工厂类实现,而是将其交给具体的产品工厂类实现.
(2)产品拓展很方便,只需要增加对应的产品类、产品工厂类即可,不违反OCP原则;
3.抽象工厂模式:
(1)是工厂方法模式的一次拓展,它把原先的工厂方法模式中只能有一个抽象产品不能添加产品族 的缺点克服了,抽象工厂模式不仅仅遵循了OCP原则,而且可以添加更多产品(抽象产品),具体工厂也不仅仅 可以生成单一产品,而是生成一组产品,抽象工厂也是声明一组产品,对应扩展更加灵活;
(2)拓展族系产品很麻烦,需要修改工厂类代码;


推荐阅读
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • 本文介绍了Java中Currency类的getInstance()方法,该方法用于检索给定货币代码的该货币的实例。文章详细解释了方法的语法、参数、返回值和异常,并提供了一个示例程序来说明该方法的工作原理。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • Netty源代码分析服务器端启动ServerBootstrap初始化
    本文主要分析了Netty源代码中服务器端启动的过程,包括ServerBootstrap的初始化和相关参数的设置。通过分析NioEventLoopGroup、NioServerSocketChannel、ChannelOption.SO_BACKLOG等关键组件和选项的作用,深入理解Netty服务器端的启动过程。同时,还介绍了LoggingHandler的作用和使用方法,帮助读者更好地理解Netty源代码。 ... [详细]
author-avatar
松原电信曹玉威_203
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有