第四章面向对象程序设计方法二

该博客围绕工厂模式展开实验,涵盖简单工厂、工厂方法和抽象工厂模式。介绍了各模式的实验内容、题目分析,绘制了类图并给出源代码。作者通过训练对三种模式理解较好,但在XML文件处理上遇到困难,怀疑是JDK版本问题并尝试解决。

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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值