一.实验目的
- 熟悉建模工具。
- 掌握简单工厂模式、工厂方法模式、抽象工厂模式,并进行设计应用。
二、实验内容
(1)、 简单工厂模式
使用简单工厂模式模拟女娲(Nvwa)造人(Person),如果传入参数M,则返回一个Man对象,如果传入参数W,则返回一个Woman对象,请实现该场景。现需要增加一个新的Robot类,如果传入参数R,则返回一个Robot对象,对代码进行修改并注意女娲的变化。
(2)、 工厂方法模式
海尔工厂(Haier)生产海尔空调(HaierAirCondition),美的工厂(Midea)生产美的空调(MideaAirCondition) 。使用工厂方法模式描述该场景,绘制类图并编程实现。
(3)、 抽象工厂模式
电脑配件生产工厂生产内存、CPU等硬件设备,这些内存、CPU的品牌、型号并不一定相同,根据下面的“产品等级结构-产品族”示意图,使用抽象工厂模式实现电脑配件生产过程并绘制相应的类图,绘制类图并编程实现。
3.题目分析
通过实验内容练习使用三种设计模式,按部就班的来就行。
4.类图设计
(1)简单工厂
(2)工厂方法
(3)抽象工厂
5,程序实现
(1)简单工厂
package SimpleFactory;
import java.util.*;
interface Person{
public void operation();
}
class man implements Person{
public void operation(){
System.out.println("man");
}
}
class woman implements Person{
public void operation(){
System.out.println("woman");
}
}
class robot implements Person{
public void operation(){
System.out.println("robot");
}
}
class Factory{
public static Person Nvwa(String con){
Person per=null;
if(con.equals("M"))
per= new man();
else if(con.equals("W"))
per= new woman();
else if(con.equals("R"))
per=new robot();
return per;
}
}
public class Simple_factory {
public static void main(String [] args) {
Scanner scanner = new Scanner(System.in);
String operation = scanner.nextLine();
System.out.print("女娲造人:");
Person p=Factory.Nvwa(operation);
p.operation();
scanner.close();
}
}
(2)工厂方法
package factorymethod;
public interface AirCondition {
public void play();
}
public class HaierAirCondition implements AirCondition{
public void play() {
System.out.println("Haier空调制冷!");
}
}
public class MideaAirCondition implements AirCondition{
public void play() {
System.out.println("Midea空调制冷!");
}
}
public interface AirConditionFactory {
public AirCondition produceAirCondition();
}
public class HaierFactory implements AirConditionFactory{
public AirCondition produceAirCondition() {
System.out.println("Haier 工厂生产Haier 空调!");
return new HaierAirCondition();
}
}
public class MideaFactory implements AirConditionFactory{
public AirCondition produceAirCondition() {
System.out.println("Midea 工厂生产Midea 空调!");
return new MideaAirCondition();
}
}
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;
}
}
}
public class Client
{
public static void main(String args[])
{
try
{
AirCondition air;
AirConditionFactory factory;
factory=(AirConditionFactory)XMLUtil.getBean();
air=factory.produceAirCondition();
air.play();
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
}
}
(3)抽象工厂
package indi.zxp.AbstractFactory;
public interface MAC {
public void produce();
}
public class MACCPU implements MAC{
public void produce() {
System.out.println("生产MAC类产品CPU");
}
}
public class MACRAM implements MAC{
public void produce() {
System.out.println("生产MAC类产品RAM");
}
}
public interface PC {
public void produce();
}
public class PCCPU implements PC{
public void produce() {
System.out.println("生产MAC类产品CPU");
}
}
public class PCRAM implements PC{
public void produce() {
System.out.println("生产PC类产品RAM");
}
}
public interface Factory {
public PC producePC();
public MAC produceMAC();
}
public class CPUfactory implements Factory{
public PC producePC() {
return new PCCPU();
}
public MAC produceMAC() {
return new MACCPU();
}
}
public class RAMfactory implements Factory{
public PC producePC() {
return new PCRAM();
}
public MAC produceMAC() {
return new MACRAM();
}
}
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("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;
}
}
}
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
try
{
Factory factory;
PC p;
MAC m;
factory=(Factory)XMLutil.getBean();
p=factory.producePC();
p.produce();
m=factory.produceMAC();
m.produce();
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
}
}
6.调试、测试及运行结果
运行结果:
(1) 简单工厂模式
(2) 工厂方法模式
(3) 抽象工厂模式
7.经验归纳
该次上机重在通过所给情景,练习使用几种设计模式,通过练习使用UML类图和总结几种常见的设计模式,达到提高面向对象编程的能力。XML文件提供了一种不同于Scanner构造器的输入方式,具体总结在这个地方:https://blog.csdn.net/qq_44002167/article/details/89890433