1.实验内容
1.1简单工厂模式
使用简单工厂模式模拟女娲(Nvwa)造人(Person),如果传入参数M,则返回一个Man对象,如果传入参数W,则返回一个Woman对象,请实现该场景。现需要增加一个新的Robot类,如果传入参数R,则返回一个Robot对象,对代码进行修改并注意女娲的变化。
1.2工厂方法模式
海尔工厂(Haier)生产海尔空调(HaierAirCondition),美的工厂(Midea)生产美的空调(MideaAirCondition) 。使用工厂方法模式描述该场景,绘制类图并编程实现。
1.3抽象工厂模式
电脑配件生产工厂生产内存、CPU等硬件设备,这些内存、CPU的品牌、型号并不一定相同,根据下面的“产品等级结构-产品族”示意图,使用抽象工厂模式实现电脑配件生产过程并绘制相应的类图,绘制类图并编程实现。
2.题目分析
2.1简单工厂模式
1.创建工厂角色personfactory;
2.创建抽象产品角色Nvwa;
3.创建具体产品角色Man,Woman,Robot.
2.2工厂方法模式
1.创建抽象工厂ConditionFactory;
2.创建具体工厂HaierFactory,MideaFactory;
3.创建抽象产品Conditioner;
4.创建具体产品 Haier,Midea.
2.3抽象工厂模式
1.创建抽象工厂EFactory;
2.创建具体工厂MACFactory,PcFactory;
3.创建抽象产品CPU,RAM;
4.创建具体产品MACRAM,MACCPU,PcRAM,PcCPU.
3.类图
3.1简单工厂模式
3.2工厂方法模式
3.3抽象工厂模式
源代码
简单工厂模式
抽象产品角色
package SimpleFactory;
public interface Nvwa {
public void play();
}
工厂角色
package SimpleFactory;
public class personFactory{
public static Nvwa producePerson(String brand) throws Exception
{
if(brand.equalsIgnoreCase("M"))
{
System.out.println("女娲造了男生!");
return new Man();
}
else if(brand.equalsIgnoreCase("W"))
{
System.out.println("女娲造了女生!");
return new Woman();
}
else if(brand.equalsIgnoreCase("R"));
{
System.out.println("女娲造了机器人!");
return new Robot();
}
}
}
具体产品角色
package SimpleFactory;
public class Man implements Nvwa
{
public void play()
{
System.out.println("男生正在被制造......");
}
}
package SimpleFactory;
public class Woman implements Nvwa
{
public void play()
{
System.out.println("女生正在被制造......");
}
}
package SimpleFactory;
public class Robot implements Nvwa
{
public void play()
{
System.out.println("机器人正在被制造......");
}
}
客户类及XML
package SimpleFactory;
public class Client
{
public static void main(String args[])
{
try
{
Nvwa nvwa;
String brandName=XMLUtilNvwa.getBrandName();
nvwa=personFactory.producePerson(brandName);
nvwa.play();
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
}
}
package SimpleFactory;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.xml.sax.SAXException;
import java.io.*;
public class XMLUtilNvwa
{
//该方法用于从XML配置文件中提取品牌名称,并返回该品牌名称
public static String getBrandName()
{
try
{
//创建文档对象
DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dFactory.newDocumentBuilder();
Document doc;
doc = builder.parse(new File("SimpleFactoryconfigNvwa.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;
}
}
}
工厂方法模式
抽象工厂
package factorymethod;
public interface ConditionFactory
{
public Conditioner produceConditioner();
}
具体工厂
package factorymethod;
public class HaierFactory implements ConditionFactory
{
public Conditioner produceCondition()
{
System.out.println("海尔工厂生产海尔空调。");
return (Conditioner) new Haier();
}
public Conditioner produceConditioner() {
// TODO Auto-generated method stub
return null;
}
}
package factorymethod;
public class MideaFactory implements ConditionFactory
{
public Conditioner produceCondition()
{
System.out.println("海信电视机工厂生产海信电视机。");
return (Conditioner) new Midea();
}
public Conditioner produceConditioner() {
// TODO Auto-generated method stub
return null;
}
}
抽象产品
package factorymethod;
public interface Conditioner
{
public void play();
}
具体产品
package factorymethod;
public class Haier {
public void play()
{
System.out.println("海尔空调生产中......");
}
}
package factorymethod;
public class Midea {
public void play()
{
System.out.println("美的空调生产中......");
}
}
客户类
package factorymethod;
public class Client
{
public static void main(String args[])
{
try
{
Conditioner co;
ConditionFactory factory;
factory=(ConditionFactory)XMLUtil.getBean();
co=factory.produceConditioner();
co.play();
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
}
}
抽象工厂模式
抽象工厂
package abstractfactory;
public interface EFactory
{
public RAM produceRAM();
public CPU produceCPU();
}
具体工厂
package abstractfactory;
public class MACFactory implements EFactory
{
public RAM produceRAM()
{
return new MACRAM();
}
public CPU produceAirCPU()
{
return new MACCPU();
}
public CPU produceCPU() {
// TODO Auto-generated method stub
return null;
}
}
package abstractfactory;
public class PcFactory implements EFactory
{
public RAM produceRAM()
{
return new PcRAM();
}
public CPU produceAirCPU()
{
return new PcCPU();
}
public CPU produceCPU() {
// TODO Auto-generated method stub
return null;
}
}
抽象产品
package abstractfactory;
public interface RAM
{
public void play();
}
package abstractfactory;
public interface CPU
{
public void play();
}
具体产品
package abstractfactory;
public class PcRAM implements RAM
{
public void play()
{
System.out.println("PcRAM生产中......");
}
}
package abstractfactory;
public class PcCPU implements CPU
{
public void play()
{
System.out.println("PcCPU生产中......");
}
}
package abstractfactory;
public class MACRAM implements RAM
{
public void play()
{
System.out.println("MACRAM生产中......");
}
}
package abstractfactory;
public class MACCPU implements CPU
{
public void play()
{
System.out.println("MACCPU生产中......");
}
}
客户类
package abstractfactory;
public class Client
{
public static void main(String args[])
{
try
{
EFactory factory;
RAM ram;
CPU cpu;
factory=(EFactory)XMLUtil.getBean();
ram=factory.produceRAM();
ram.play();
cpu=factory.produceCPU();
cpu.play();
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
}
}
总结
通过这三题的训练,,对简单工厂模式、工厂方法模式、抽象工厂模式的理解还是比较好的,并没有遇到大的困难。在这次的作业中的最大的难点是XML文件,自己不知道怎么下手写,后在第二次上课时特别注意了老师对这块内容的讲解,虽然我依然没有弄明白里面的代码的含义,但我照猫画虎把老师的XML文件复制到了我自己写的文件下,结果依然有错。这让我又很迷茫,想来想去,会不会是JDK版本的问题,记得老师第一次上课运行时好像也是这个问题,于是我上网查怎么切换JDK版本,发现自己的电脑上只有1.8没有其他版本,然后我又去下载其他版本的JDK。