一、题目分析
(1)、简单工厂模式
使用简单工厂模式模拟女娲(Nvwa)造人(Person),如果传入参数M,则返回一个Man对象,如果传入参数W,则返回一个Woman对象,请实现该场景。现需要增加一个新的Robot类,如果传入参数R,则返回一个Robot对象,对代码进行修改并注意女娲的变化。
(2)、工厂方法模式
海尔工厂(Haier)生产海尔空调(HaierAirCondition),美的工厂(Midea)生产美的空调(MideaAirCondition) 。使用工厂方法模式描述该场景,绘制类图并编程实现。
(3)、抽象工程模式
电脑配件生产工厂生产内存、CPU等硬件设备,这些内存、CPU的品牌、型号并不一定相同,根据下面的“产品等级结构-产品族”示意图,使用抽象工厂模式实现电脑配件生产过程并绘制相应的类图,绘制类图并编程实现。
二、代码实现
(1)简单工厂模式
1.1 M.java
package simplefactory;
public class M implements NvWa
{
public void play()
{
System.out.println("男人创造中......");
}
}
1.2 W.java
package simplefactory;
public class W implements NvWa{
public void play()
{
System.out.println("女人创造中......");
}
}
1.3 R.java
package simplefactory;
public class R implements NvWa {
public void play()
{
System.out.println("机器人创造中......");
}
}
1.4 NvWa.java
package simplefactory;
public interface NvWa {
public void play();
}
1.5 People.java
package simplefactory;
public class People {
public static void main(String [] args)
{
try
{
NvWa nvwa;
String brandName=XMLUtilTV.getBrandName();
nvwa=PeopleFactory.producePeople(brandName);
nvwa.play();
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
}
}
1.6 PeopleFactory.java
package simplefactory;
public class PeopleFactory {
public static NvWa producePeople(String brand) throws Exception
{
if(brand.equalsIgnoreCase("M"))
{
System.out.println("女娲在创造男人!");
return new M();
}
else if(brand.equalsIgnoreCase("W"))
{
System.out.println("女娲在创造女人!");
return new W();
}
else if(brand.equalsIgnoreCase("R"))
{
System.out.println("女娲在创造机器人!");
return new R();
}
else
{
throw new Exception("对不起,我还是一块泥巴!");
}
}
}
1.7 XMLUtilTV.java
package simplefactory;
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("configPeople.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;
}
}
}
(2)工厂方法模式
2.1 AirCondition.java
package factorymethod;
public interface AirCondition {
public void play();
}
2.2 AirConditionFactory.java
package factorymethod;
public interface AirConditionFactory {
public AirCondition produceAirCondition();
}
2.3 Client.java
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());
}
}
}
2.4 Haier.java
package factorymethod;
public class Haier implements AirCondition{
public void play()
{
System.out.println("海尔空调使用中......");
}
}
2.5 HaierFactory.java
package factorymethod;
public class HaierFactory implements AirConditionFactory
{
public AirCondition produceAirCondition()
{
System.out.println("海尔空调工厂生产海尔空调。");
return new Haier();
}
}
2.6 Midea.java
package factorymethod;
public class Midea implements AirCondition
{
public void play()
{
System.out.println("美的空调使用中......");
}
}
2.7 MideaFactory.java
package factorymethod;
public class MideaFactory implements AirConditionFactory
{
public AirCondition produceAirCondition()
{
System.out.println("美的空调工厂生产美的空调。");
return new Midea();
}
}
2.8 XMLUtil.java
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)抽象工厂模式
3.1 ComputerAccessoriesFactory.java
package abstractfactory;
public interface ComputerAccessoriesFactory {
CPU produceCPU();
RAM produceRAM();
}
3.2 CPU.java
package abstractfactory;
public interface CPU {
void discribe();
}
3.3 MacCPU.java
package abstractfactory;
public class MacCPU implements CPU{
public void discribe()
{
System.out.println("这是在生产 Mac_CPU");
}
}
3.4 MacFactory.java
package abstractfactory;
public class MacFactory implements ComputerAccessoriesFactory{
public MacCPU produceCPU() {
System.out.println("MacCPU生产完成");
return new MacCPU();
}
public MacRAM produceRAM() {
System.out.println("MacARM生产完成");
return new MacRAM();
}
}
3.5 MacRAM.java
package abstractfactory;
public class MacRAM implements RAM
{
public void discribe()
{
System.out.println("MacRAM");
}
}
3.6 PcCPU.java
package abstractfactory;
public class PcCPU implements CPU
{
public void discribe()
{
System.out.println("这是在生产PC_CPU");
}
}
3.7 PcFactory.java
package abstractfactory;
public class PcFactory implements ComputerAccessoriesFactory
{
public PcCPU produceCPU() {
System.out.println("PC_CPU生产完成!");
return new PcCPU();
}
public PcRAM produceRAM() {
System.out.println("PC_RAM生产完成 !");
return new PcRAM();
}
}
3.8 PcRAM.java
package abstractfactory;
public class PcRAM implements RAM
{
public void discribe()
{
System.out.println("PcRAM");
}
}
3.9 RAM.java
package abstractfactory;
public interface RAM {
void discribe();
}
3.10 Test.java
package abstractfactory;
public class Test {
public static void main(String[] args) {
try
{
CPU cpu;
RAM ram;
ComputerAccessoriesFactory factory;
factory=(ComputerAccessoriesFactory)XMLUtil.getBean();
cpu=factory.produceCPU();
cpu.discribe();
ram=factory.produceRAM();
ram.discribe();
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
}
}
3.11 XMLUtil.java
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;
}
}
}