一.题目分析
(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配置文件里的代码时,一定要注意类名是否一导致。如果不一致的话,出来的结果将会是空。其中还要注意不同的具体类要作为接口的实现类。

相关文章: