一.问题描述
(1)、
简单工厂模式
使用简单工厂模式模拟女娲(Nvwa)造人(Person),如果传入参数M,则返回一个Man对象,如果传入参数W,则返回一个Woman对象,请实现该场景。现需要增加一个新的Robot类,如果传入参数R,则返回一个Robot对象,对代码进行修改并注意女娲的变化。
(2)、
工厂方法模式
海尔工厂(Haier)生产海尔空调(HaierAirCondition),美的工厂(Midea)生产美的空调(MideaAirCondition) 。使用工厂方法模式描述该场景,绘制类图并编程实现。
(3)、
抽象工程模式
电脑配件生产工厂生产内存、CPU等硬件设备,这些内存、CPU的品牌、型号并不一定相同,根据下面的“产品等级结构-产品族”示意图,使用抽象工厂模式实现电脑配件生产过程并绘制相应的类图,绘制类图并编程实现。
二.UML类图
1.简单工厂模式类图
2.工厂模式类图
3.抽象模式类图
三.代码实现
1.简单工厂模式
package
simplefactory;
public interface Race
{
public void
play();
}
public class Men implements
Race{
public void
play()
{
System.out.println("男人生产中...");
}
}
public class
Robot implements Race{
public void
play()
{
System.out.println("机器人生产中...");
}
}
public class
Women implements Race{
public void
play(){
System.out.println("女人生产中...");
}
}
public class
Racefactory {
public static Race
producePerson(String brand) throws
Exception
{
if(brand.equalsIgnoreCase("M"))
{
System.out.println("女娲生产男人");
return new
Men();
}
else if(brand.equalsIgnoreCase("W"))
{
System.out.println("女娲生产女人");
return new
Women();
}
else if(brand.equalsIgnoreCase("R"))
{
System.out.println("女娲生产机器人");
return new
Robot();
}
else
{
throw new
Exception("对不起,暂不能生产");
}
}
}
public class
People {
public static void
main(String[] args) {
try
{
Race p;
String Type=XMLUtilPerson.getType();
p=Racefactory.producePerson(type);
p.play();
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
}
}
public class XMLUtilperson {
package
simplefactory;
import
javax.xml.parsers.*;
import
org.w3c.dom.*;
import
org.xml.sax.SAXException;
import
java.io.*;
public
class XMLUtilPerson {
//该方法用于从XML配置文件中提取品牌名称,并返回该品牌名称
public
static String getType()
{
try
{
//创建文档对象
DocumentBuilderFactory
dFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder
builder = dFactory.newDocumentBuilder();
Document
doc;
doc=builder.parse(new
File("SimpleFactoryconfigPerson.xml"));
//获取包含品牌名称的文本节点
NodeList
nl = doc.getElementsByTagName("type");
Node
classNode=nl.item(0).getFirstChild();
String type=classNode.getNodeValue().trim();
return type;
}
catch(Exception
e)
{
e.printStackTrace();
return
null;
}
}
}
}
2.工厂模式代码
package
factorymethod;
public interface Air
{
public void
play();
}
public interface
AirFactory {
public Air
produceAir();
}
public class
Haierair implements Air {
public void
play(){
System.out.println("海信空调工作中...");
}
}
public class
HaierairFactory implements
AirFactory{
public Air
produceAir(){
System.out.println("海尔工厂生产海尔空调。");
return new
Haierair();
}
}
public class
Meidiair implements Air{
public void
play(){
System.out.println("美的空调工作中");
}
}
public class
MeidiairFactory implements
AirFactory{
public Air
produceAir(){
System.out.println("美的工厂生产美的空调。");
return new
Meidiair();
}
}
public class
Client {
public static void
main(String args[])
{
try
{
Air a;
AirFactory
factory;
factory=(AirFactory)XMLUtil.getBean();
a=factory.produceAir();
a.play();
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
}
}
import
javax.xml.parsers.*;
import
org.w3c.dom.*;
import org.xml.sax.SAXException;
import
java.io.*;
public class
XMLUtil {
public static
Object getBean()
{
try
{
//创建文档对象
DocumentBuilderFactory
dFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder
builder = dFactory.newDocumentBuilder();
Document
doc;
doc
= builder.parse(new
File("FactoryMethodconair.xml"));
//获取包含类名的文本节点
NodeList
nl = doc.getElementsByTagName("airName");
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.抽象工厂模式代码
package
abstractfactory;
public interface CPU
{
public void
play();
}
public interface RAM
{
public void
body();
}
public interface
Efactory {
public CPU
produceCPU();
public RAM
produceRAM();
}
public class
MacFactory implements Efactory{
public CPU
produceCPU()
{
return new
MacCPU();
}
public RAM
produceRAM()
{
return new
MacRAM();
}
}
public class
PcFactory implements Efactory{
public CPU
produceCPU()
{
return new
PcCPU();
}
public RAM
produceRAM()
{
return new
PcRAM();
}
}
public class
MacCPU implements CPU{
public void
play(){
System.out.println("MacCPU工作中......");
}
}
public class
MacRAM implements RAM{
public void
body(){
System.out.println("MacRAM工作中...");
}
}
public class
PcCPU implements CPU{
public void
play(){
System.out.println("PcCPU工作中...");
}
}
public class
PcRAM implements RAM{
public void
body(){
System.out.println("PcRAM工作中...");
}
}
public class
Client {
public static void
main(String args[])
{
try
{
Efactory factory;
CPU cpu;
RAM ram;
factory=(Efactory)XMLUtil.getBean();
cpu=factory. produceCPU();
cpu.play();
ram=factory.produceRAM();
ram.body();
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
}
}
import
javax.xml.parsers.*;
import
org.w3c.dom.*;
import org.xml.sax.SAXException;
import
java.io.*;
public class
XMLUtil {
public static
Object getBean()
{
try
{
//创建文档对象
DocumentBuilderFactory
dFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder
builder = dFactory.newDocumentBuilder();
Document
doc;
doc
= builder.parse(new
File("FactoryMethodconFactory.xml"));
//获取包含类名的文本节点
NodeList
nl = doc.getElementsByTagName("FatoryName");
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;
}
}
}
四.实验总结
这次实验实践和了解了简单工厂模式,工厂方法模式,抽象工厂模式的主要思想。这次编程主要问题就是抽象类和实现类的关系,我记的比较混乱,自己逻辑不是很清晰;这次实验主要参考老师的代码来进行修改,自己也学习了很多Java编程的思想;还有一个重要的问题就是没有很清晰的了解XML文件,老师代码中的XMLUtil类不清楚,只会根据代码进行改动,然后自己学习了一下XML文件的用法,这个是最大的收获。
学习XML文件网站[https://www.cnblogs.com/stroll/p/7064503.html]。