一、实验目的
1) 熟悉建模工具。
2) 掌握简单工厂模式、工厂方法模式、抽象工厂模式,并进行设计应用。
二、实验内容
(1)简单工厂模式
使用简单工厂模式模拟女娲(Nvwa)造人(Person),如果传入参数M,则返回一个Man对象,如果传入参数W,则返回一个Woman对象,请实现该场景。现需要增加一个新的Robot类,如果传入参数R,则返回一个Robot对象,对代码进行修改并注意女娲的变化。
(2)工厂方法模式
海尔工厂(Haier)生产海尔空调(HaierAirCondition),美的工厂(Midea)生产美的空调(MideaAirCondition) 。使用工厂方法模式描述该场景,绘制类图并编程实现。
(3)抽象工程模式
电脑配件生产工厂生产内存、CPU等硬件设备,这些内存、CPU的品牌、型号并不一定相同,根据下面的“产品等级结构-产品族”示意图,使用抽象工厂模式实现电脑配件生产过程并绘制相应的类图,绘制类图并编程实现。
三、要求
1、题目分析
①对于使用简单工厂模拟女娲造人该程序,需建立七个类,分别为接口类Person(抽象产品类)、Man类(具体产品类实现接口)、Woman(具体产品类实现接口)、Robot(具体产品类实现接口)、Nvwa类(工厂类,提供静态工厂方法)、Client类(主类)和XMLUtitlpeopel类(写配置文件)
②使用工厂方法模式描述两家品牌生产空调,需建立八个类,分别为两个接口类实现抽象产品Factory、Work,两个具体产品类Haier、Meidi,两个工厂类HaierFactory、MeidiFactory、主类Client和配置文件XMLUtil类
③使用抽象工厂模式实现电脑配件生产过程,在该程序中我创建了十一个类,其中包括主类Client、生产CPU和RAM的两个接口类(CFactory,Play)、四个具体产品类、两个工厂类、配置文件XMLUtitle类和定义produceCPU、produceRAM函数的接口类
2、类图设计
①简单工厂模式
②工厂方法模式
③抽象工程模式
3.代码实现
①简单工厂模式模拟女娲造人
package 工厂;
//抽象产品类
public interface Person {//创建一个Person接口类
public void make();
}
package 工厂;
//具体产品类Man
public class Man implements Person{//通过implements实现接口Person
public void make(){
System.out.println("男人创造成功!");
}
}
package 工厂;
//具体产品类Woman
public class Woman implements Person{//通过implements实现接口Person
public void make(){
System.out.println("女人创造成功!");
}
}
package 工厂;
//具体产品类Robot
public class Robot implements Person{//通过implements实现接口Person
public void make(){
System.out.println("机器人创造成功!");
}
}
package 工厂;
//工厂类Nvwa,提供静态工厂方法producePeople()
public class Nvwa {
public static Person producePeople(String create) throws Exception
{
if(create.equalsIgnoreCase("M"))//当字符串为M时
{
System.out.println("女娲在创造男人...");
return new Man();//返回Man类
}
else if(create.equalsIgnoreCase("W"))//当字符串为W时
{
System.out.println("女娲在创造女人");
return new Woman();//返回Woman类
}
else if(create.equalsIgnoreCase("R"))//当字符串为R时
{
System.out.println("女娃在创造机器人");
return new Robot();//返回Robot类
}
else
{
throw new Exception("对不起,女娲不在,暂不能生产该类型的人或机器!!");
}
}
}
package 工厂;
//主类
public class Client {
public static void main(String[] args){
try
{
Person pe;//创建对象pe
String createName=XMLUtilpeople.getCreateName();//调用XMLUtitlpeople类里的getCreatName函数
pe=Nvwa.producePeople(createName);//调用Nvwa类里的producePeople函数
pe.make();
}
catch(Exception e)
{//异常处理
System.out.println(e.getMessage());
}
}
}
package 工厂;
import java.io.*;
import javax.xml.parsers.*;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class XMLUtilpeople {
//该方法用于从XML配置文件中提取品牌名称,并返回该品牌名称
public static String getCreateName()
{
try
{
//创建文档对象
DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dFactory.newDocumentBuilder();
Document doc;
doc = builder.parse(new File("Nvwa.xml")); //读取XML文件,返回Document对象
//获取包含品牌名称的文本节点
NodeList nl = doc.getElementsByTagName("createName");
Node classNode=nl.item(0).getFirstChild();
String createName=classNode.getNodeValue().trim();
return createName;
}
catch(Exception e)
{//异常处理
e.printStackTrace();
return null;
}
}
}
②工厂方法模式
package Fac;
//抽象产品类
public interface Work {
public void work();
}
package Fac;
//抽象产品类
public interface Factory {
public Work produce();
}
package Fac;
//具体产品类Haier
public class Haier implements Work{//通过implements实现接口Work
public void work() {
System.out.println("海尔空调工作中");
}
}
package Fac;
//具体产品类
public class Meidi implements Work{//通过implements实现接口Work
public void work() {
System.out.println("美的空调工作中");
}
}
package Fac;
//工厂类
public class HaierFactory implements Factory{//通过implements实现接口Factory
public Work produce() {
System.out.println("海尔工厂生产海尔空调");
return new Haier();//返回Haier类
}
}
package Fac;
//工厂类
public class MeidiFactory implements Factory{//通过implements实现接口Factory
public Work produce() {
System.out.println("美的工厂生产美的空调");
return new Meidi();//返回Meidi类
}
}
package Fac;
//主类
public class Client {
public static void main(String args []) {
try {
Work w;//创建对象w
Factory factory;//创建对象factory
factory=(Factory)XMLUtil.getBean();//调用XMLUtil类里面的getBean()函数
w=factory.produce();//调用函数produce()
w.work();
}
catch(Exception e) {
//异常处理
System.out.println(e.getMessage());
}
}
}
package Fac;
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("File.xml")); //读取XML文件,返回Document对象
//获取包含类名的文本节点
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;
}
}
}
③抽象工厂模式
package Computer;
//生产CPU的接口
public interface CFactory {
public void make();
}
package Computer;
//生产RAM的接口
public interface Play {
public void play();
}
package Computer;
//接口类,定义produceCPU函数和produceRAM函数
public interface ComFactory {
public CFactory produceCPU();
public Play produceRAM();
}
package Computer;
//具体产品类
public class MacCpu implements CFactory{//通过implements实现接口CFactory
public void make() {
System.out.println("Mac工厂在生产CPU");
}
}
package Computer;
//具体产品类MacRam
public class MacRam implements Play{
public void play() {
System.out.println("Mac在生产RAM");
}
}
package Computer;
//工厂类MacFactory
public class MacFactory implements ComFactory{
public CFactory produceCPU() {
return new MacCpu();
}
public Play produceRAM() {
return new MacRam();
}
}
package Computer;
//具体产品类PcCpu
public class PcCpu implements CFactory{
public void make() {
System.out.println("PC工厂在生产CPU");
}
}
package Computer;
//具体产品类PcRam
public class PcRam implements Play{
public void play() {
System.out.println("PC工厂在生产RAM");
}
}
package Computer;
//工厂类PcFactory
public class PcFactory implements ComFactory{
public CFactory produceCPU() {
return new PcCpu();
}
public Play produceRAM() {
return new PcRam();
}
}
package Computer;
//主类
public class Client {
public static void main(String[] args) {
try
{
ComFactory factory;//创建对象factory
CFactory tv;//创建对象tv
Play ac;//创建对象ac
factory=(ComFactory)XMLUtile.getBean();//调用XMLUtitle类里面的getBean()函数
tv=factory.produceCPU();//调用函数produceCPU()
tv.make();
ac=factory.produceRAM();//调用函数produceRAM()
ac.play();
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
}
}
package Computer;
import java.io.File;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.xml.sax.SAXException;
import java.io.*;
public class XMLUtile {
//该方法用于从XML配置文件中提取品牌名称,并返回该品牌名称
public static Object getBean()
{
try
{
//创建文档对象
DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dFactory.newDocumentBuilder();
Document doc;
doc = builder.parse(new File("computer.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;
}
}
}
4.调试、测试及运行结果
①简单工厂
调试
运行结果
②工厂方法模式
调试
运行结果
③抽象工程模式
调试
运行结果
5、经验归纳
此次作业的主要目的是掌握简单工厂简单工厂模式、工厂方法模式、抽象工厂模式,并进行设计应用。
在编写代码时遇到的问题:
①对于读取XML文件的不熟悉,只能参照模板写或者上网搜索,因此这次程序中的读取XML文件,我是用了两种方法来写,一种是参照老师给的代码中的XML文件来写(SAX实现方法),另一种是DOM实现方法;
②在使用简单工厂模拟女娲造人代码的编写过程中,传参数时遇到了问题,不清楚该怎么传参数,然后就在网上找到了该代码,参考了别人的代码,是使用函数equalsIgnoreCase():进行传参的,并且了解了该函数,该函数与equal()用法相似,但是equalsIgnoreCase()可以同时识别大小写。
此次作业体会
在完成该作业的过程中,我学到了很多比如,对简单简单工厂模式、工厂方法模式、抽象工厂模式加深了印象,并且熟练掌握了接口类的实现。对XML文件也有所了解。