设计模式(简单工厂、工厂方法、抽象工厂模式)

设计模式(简单工厂、工厂方法、抽象工厂模式)

一、实验目的
1.熟悉建模工具。
2.掌握简单工厂模式、工厂方法模式、抽象工厂模式,并进行设计应用。

二、实验内容
1.简单工厂模式
使用简单工厂模式模拟女娲(Nvwa)造人(Person),如果传入参数M,则返回一个Man对象,如果传入参数W,则返回一个Woman对象,请实现该场景。现需要增加一个新的Robot类,如果传入参数R,则返回一个Robot对象,对代码进行修改并注意女娲的变化。
2.工厂方法模式
海尔工厂(Haier)生产海尔空调(HaierAirCondition),美的工厂(Midea)生产美的空调(MideaAirCondition) 。使用工厂方法模式描述该场景,绘制类图并编程实现。
3.抽象工厂模式
电脑配件生产工厂生产内存、CPU等硬件设备,这些内存、CPU的品牌、型号并不一定相同,根据下面的“产品等级结构-产品族”示意图,使用抽象工厂模式实现电脑配件生产过程并绘制相应的类图,绘制类图并编程实现。

三、题目分析及类图设计
1.题目分析
(1)简单工厂模式:Person接口抽象一个create()方法。Woman、Man和Robot类实现Person接口的create()方法(具体创造某一人种)。Nvwa类作为一个工厂角色,接收xml文件中的参数值确定返回一个具体的人种对象。

(2)工厂方法模式:AirCondition接口抽象一个create()方法,HaierAirCondition类和MideaAirCondition类实现接口AirCondition的create()方法(具体创造某一类空调)。AirConditionFactory接口抽象一个返回AirCondition的produceAirCondition()方法。HaierAirConditionFactory类和MideaAirConditionFactory类实现AirConditionFactory接口的方法,返回一个具体的空调对象。

(3)抽象工厂模式:接口CPU抽象了一个run()方法,接口RAM抽象了一个use()方法,MacCPU类和PcCPU类实现了CPU接口中的run()方法(具体的某一种CPU运行)。MacRAM类和PcRAM类实现了RAM接口中的use()方法(具体某一种RAM在使用)。接口EFactory抽象了一个返回RAM对象的produceRAM()方法和返回CPU对象的produceCPU()方法,MacFactory类实现了EFactory接口中的两个方法,用于返回MacCPU对象和MacRAM对象,PcFactory类实现了EFactory接口中的两个方法,用于返回PcCPU对象和PcRAM对象.

2.类图设计
2.1手绘uml类图
(1)简单工厂模式:
设计模式(简单工厂、工厂方法、抽象工厂模式)_第1张图片
(2)工厂方法模式:
设计模式(简单工厂、工厂方法、抽象工厂模式)_第2张图片
(3) 抽象工厂模式:
设计模式(简单工厂、工厂方法、抽象工厂模式)_第3张图片
2.2在eclipse中使用AmaterasUML工具生成的UML类图:
(1)简单工厂:
设计模式(简单工厂、工厂方法、抽象工厂模式)_第4张图片
(2)工厂方法:
设计模式(简单工厂、工厂方法、抽象工厂模式)_第5张图片
(3)抽象工厂模式:
设计模式(简单工厂、工厂方法、抽象工厂模式)_第6张图片
四、测试与调试
(1)简单工厂模拟女娲造人:
设计模式(简单工厂、工厂方法、抽象工厂模式)_第7张图片
在这里插入图片描述
设计模式(简单工厂、工厂方法、抽象工厂模式)_第8张图片
(2)工厂方法:
设计模式(简单工厂、工厂方法、抽象工厂模式)_第9张图片
设计模式(简单工厂、工厂方法、抽象工厂模式)_第10张图片设计模式(简单工厂、工厂方法、抽象工厂模式)_第11张图片(3)抽象工厂模式:
设计模式(简单工厂、工厂方法、抽象工厂模式)_第12张图片在这里插入图片描述在这里插入图片描述
五、总结
通过本次实验对各种设计模式有了一定的了解。
1.简单工厂:实现了对象创建和使用的分离客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可,但是若要增加类的个数,则会修改比较多。
2.工厂方法:能够让工厂自己决定创建哪个产品,添加新的产品时不会破坏开闭原则。但是增加了系统的复杂度。
3.抽象工厂模式: 当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。增加新的产品族很方便,无须修改已有系统,符合开闭原则。

同时也了解到了3种参数传递的方法:
1.利用Scanner进行输入:
设计模式(简单工厂、工厂方法、抽象工厂模式)_第13张图片
2.利用xml文件读入参数:

import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.xml.sax.SAXException;
import java.io.*;
public class XMLUtil{
    //该方法用于从XML配置文件中提取品牌名称,并返回该品牌名称
	public static String getBrandName(){
		try{
			//创建文档对象
			DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
			DocumentBuilder builder = dFactory.newDocumentBuilder();
			Document doc;							
			doc = builder.parse(new File("SimpleFactoryconfigPerson.xml")); 
		
			//获取包含品牌名称的文本节点
			NodeList nl = doc.getElementsByTagName("brandName");
            Node classNode=nl.item(0).getFirstChild();
            String brandName=classNode.getNodeValue().trim();
            return brandName;
           }catch(Exception e){
        	   
           		e.printStackTrace();
           		return null;
           	}
		}
}

3.利用args[]读入,读入的均为String类型,例子如下:
3.1在eclipse下:

设计模式(简单工厂、工厂方法、抽象工厂模式)_第14张图片在这里插入图片描述
设计模式(简单工厂、工厂方法、抽象工厂模式)_第15张图片
设计模式(简单工厂、工厂方法、抽象工厂模式)_第16张图片
3.2命令行:
设计模式(简单工厂、工厂方法、抽象工厂模式)_第17张图片

你可能感兴趣的:(java)