一.题目分析
(1)简单工厂模式
使用简单工厂模式模拟女娲()造人(Person),如果传入参数M,则返回一个Man对象,如果传入参数W,则返回一个Woman对象,请实现该场景。现需要增加一个新的Robot类,如果传入参数R,则返回一个Robot对象,对代码进行修改并注意女娲的变化。
(2)工厂方法模式
海尔工厂(Haier)生产海尔空调(HaierAirCondition),美的工厂(Midea)生产美的空调(MideaAirCondition) 。使用工厂方法模式描述该场景,绘制类图并编程实现。
(3)抽象工程模式
电脑配件生产工厂生产内存、CPU等硬件设备,这些内存、CPU的品牌、型号并不一定相同,根据下面的“产品等级结构-产品族”示意图,使用抽象工厂模式实现电脑配件生产过程并绘制相应的类图,绘制类图并编程实现。
二.类图设计
SimpleFactory:
factorymethod
Abstractfactory:
三.程序代码(Java)
(1)SimpleFactory
Client类:
package SimpleFactory;
public class Client {
public static void main(String args[])
{
try
{
Nvwa nvwa;
String brandName=XMLUtilNvwa.getBrandName();
nvwa=NvwaFactory.producePerson(brandName);
nvwa.play();
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
}
}
Man类:
package SimpleFactory;
public class Man implements Nvwa{
public void play()
{
System.out.println("女娲成功造了一个男人");
}
}
Nvwa类:
package SimpleFactory;
public interface Nvwa {
public void play();
}
NvwaFactory类:
package SimpleFactory;
public class NvwaFactory {
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();
}
else
{
throw new Exception("对不起,暂不能创造该物种!");
}
}
}
Robot类
package SimpleFactory;
public class Robot implements Nvwa{
public void play()
{
System.out.println("女娲成功造了一个机器人");
}
}
Woman类:
package SimpleFactory;
public class Woman implements Nvwa{
public void play()
{
System.out.println("女娲成功造了一个女人");
}
}
XMLUtilNvwa类;
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("SimpleFactoryconfigTV.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;
}
}
}
(2)factorymethod
AirCondition类:
package factorymethod;
public interface AirCondition {
public void play();
}
AirConditionFactory类:
package factorymethod;
public interface AirConditionFactory {
public AirCondition produceAirCondition();
}
Client类:
package factorymethod;
public class Client
{
public static void main(String args[])
{
try
{
AirCondition airCondition;
AirConditionFactory factory;
factory=(AirConditionFactory)XMLUtil.getBean();
airCondition=factory.produceAirCondition();
airCondition.play();
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
}
}
HaierAirCondition 类:
package factorymethod;
public class HaierAirCondition implements AirCondition {
public void play()
{
System.out.println("海尔空调制造中......");
}
}
HaierConditionFactory 类:
package factorymethod;
public class HaierConditionFactory implements AirConditionFactory{
public AirCondition produceAirCondition()
{
System.out.println("海尔空调工厂生产海尔空调");
return new HaierAirCondition();
}
}
MideaAirCondition 类:
package factorymethod;
public class MideaAirCondition implements AirCondition {
public void play()
{
System.out.println("美的空调制造中......");
}
}
MideaAirConditionFactory类:
package factorymethod;
public class MideaAirConditionFactory implements AirConditionFactory{
public AirCondition produceAirCondition()
{
System.out.println("美的空调工厂生产美的空调");
return new MideaAirCondition();
}
}
XMLUtil类:
package factorymethod;
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("FactoryMethodconfig.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;
}
}
}
(3)abstractfactory
Client类:
package abstractfactory;
public class Client {
public static void main(String args[])
{
try
{
Factory factory;
RAM ram;
CPU cpu;
factory=(Factory)XMLUtil.getBean();
ram=factory.produceRAM();
ram.play();
cpu=factory.produceCPU();
cpu.show();
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
}
}
CPU类:
package abstractfactory;
public interface CPU {
public void show();
}
Factory类:
package abstractfactory;
public interface Factory {
public RAM produceRAM();
public CPU produceCPU();
}
MacCPU 类:
package abstractfactory;
public class MacCPU implements CPU{
public void show()
{
System.out.println("MacCPU制造中......");
}
}
MacFactory类:
package abstractfactory;
public class MacFactory implements Factory{
public RAM produceRAM()
{
return new MacRAM();
}
public CPU produceCPU()
{
return new MacCPU();
}
}
MacRAM类:
package abstractfactory;
public class MacRAM implements RAM{
public void play()
{
System.out.println("MacRAM制造中......");
}
}
PcCPU类:
package abstractfactory;
public class PcCPU implements CPU{
public void show()
{
System.out.println("PcCPU制造中......");
}
}
PcFactory类:
package abstractfactory;
public class PcFactory implements Factory {
public RAM produceRAM()
{
return new PcRAM();
}
public CPU produceCPU()
{
return new PcCPU();
}
}
PcRAM 类:
package abstractfactory;
public class PcRAM implements RAM {
public void play()
{
System.out.println("PcRAM制造中......");
}
}
RAM类:
package abstractfactory;
public interface RAM {
public void play();
}
XMLUtil类:
package abstractfactory;
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("AbstractFactoryconfig.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;
}
}
}
四.调试、测试及运行结果
调试:
运行程序时发现出现如下情况:
第一列提示找不到指定文件,在相应的文件目录里果然找不到相应的SimpleFactoryconfigTV.xml。
往目录里添加xml文件,
最后程序运行成功了。
结果:
(1)工厂方法
(2)抽象工厂
(3)简单工厂
五.经验归纳
在编写XML配置文件里的代码时,一定要注意类名是否一导致。如果不一致的话,出来的结果将会是空。其中还要注意不同的具体类要作为接口的实现类。