第四章 面向对象程序设计方法

一、实验目的

1) 熟悉建模工具。

2) 掌握简单工厂模式、工厂方法模式、抽象工厂模式,并进行设计应用。

二、实验内容

1)简单工厂模式

使用简单工厂模式模拟女娲(Nvwa)造人(Person),如果传入参数M,则返回一个Man对象,如果传入参数W,则返回一个Woman对象,请实现该场景。现需要增加一个新的Robot类,如果传入参数R,则返回一个Robot对象,对代码进行修改并注意女娲的变化。

2)工厂方法模式

海尔工厂(Haier)生产海尔空调(HaierAirCondition),美的工厂(Midea)生产美的空调(MideaAirCondition) 。使用工厂方法模式描述该场景,绘制类图并编程实现。

3)抽象工程模式

电脑配件生产工厂生产内存、CPU等硬件设备,这些内存、CPU的品牌、型号并不一定相同,根据下面的“产品等级结构-产品族”示意图,使用抽象工厂模式实现电脑配件生产过程并绘制相应的类图,绘制类图并编程实现。

第四章 面向对象程序设计方法_第1张图片

三、要求

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、类图设计

①简单工厂模式

第四章 面向对象程序设计方法_第2张图片

 ②工厂方法模式

第四章 面向对象程序设计方法_第3张图片

 ③抽象工程模式

第四章 面向对象程序设计方法_第4张图片

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张图片

 运行结果

第四章 面向对象程序设计方法_第6张图片

 

②工厂方法模式

调试

第四章 面向对象程序设计方法_第7张图片

运行结果

第四章 面向对象程序设计方法_第8张图片

③抽象工程模式

调试

第四章 面向对象程序设计方法_第9张图片

运行结果

第四章 面向对象程序设计方法_第10张图片

5、经验归纳

此次作业的主要目的是掌握简单工厂简单工厂模式、工厂方法模式、抽象工厂模式,并进行设计应用。

在编写代码时遇到的问题

①对于读取XML文件的不熟悉,只能参照模板写或者上网搜索,因此这次程序中的读取XML文件,我是用了两种方法来写,一种是参照老师给的代码中的XML文件来写(SAX实现方法),另一种是DOM实现方法;

②在使用简单工厂模拟女娲造人代码的编写过程中,传参数时遇到了问题,不清楚该怎么传参数,然后就在网上找到了该代码,参考了别人的代码,是使用函数equalsIgnoreCase():进行传参的,并且了解了该函数,该函数与equal()用法相似,但是equalsIgnoreCase()可以同时识别大小写。

此次作业体会

在完成该作业的过程中,我学到了很多比如,对简单简单工厂模式、工厂方法模式、抽象工厂模式加深了印象,并且熟练掌握了接口类的实现。对XML文件也有所了解。

你可能感兴趣的:(第四章 面向对象程序设计方法)