第四章作业(二)

作者:A.y.

时间:2019/5/4

上机环境:Eclipse

UML类图插件:AmaterasUML

一、实验目的

  1. 熟悉建模工具。
  2. 掌握简单工厂模式、工厂方法模式、抽象工厂模式,并进行设计应用。

二、问题描述
(1)、 简单工厂模式
使用简单工厂模式模拟女娲(Nvwa)造人(Person),如果传入参数M,则返回一个Man对象,如果传入参数W,则返回一个Woman对象,请实现该场景。现需要增加一个新的Robot类,如果传入参数R,则返回一个Robot对象,对代码进行修改并注意女娲的变化。
(2)、工厂方法模式
海尔工厂(Haier)生产海尔空调(HaierAirCondition),美的工厂(Midea)生产美的空调(MideaAirCondition) 。使用工厂方法模式描述该场景,绘制类图并编程实现。
(3)、抽象工程模式
电脑配件生产工厂生产内存、CPU等硬件设备,这些内存、CPU的品牌、型号并不一定相同,根据下面的“产品等级结构-产品族”示意图,使用抽象工厂模式实现电脑配件生产过程并绘制相应的类图,绘制类图并编程实现。
第四章作业(二)

三、题目分析
(1).简单工厂模式:首先设置一个人物类接口Individuals;之后再用Man、Woman、Robot类来实现这个接口,这三个类中分别有无参的构造函数来判断是否创建对象成功;再创建一个Nvwa类根据输入的字符来创建指定的对象,最后在Test类里进行测试。该模式下要新增创建的对象需要改变Nvwa类中的代码,违反了开闭原则。

(2).工厂方法模式:首先分别设置产品接口Product和工厂接口Factory;之后用Hair、Medea实现Product接口,两个类中分别有无参的构造函数来判断是否创建对象成功;再用HairFactory、MedeaFactory来实现Factory接口,两个类分别用来创建Hair、Medea类对象,最后在Test类里进行测试。

(3).抽象工厂模式:首先创建CPU接口、RAM接口和Factory接口;之后再用PcCPU、MacCPU实现CPU接口,PcRAM、MacRAM实现RAM接口;然后再用PcFactory、MacFactory实现Factory接口,分别用来创建对应族的CPU和RAM;最后在Test类里进行测试。

四、UML类图
(1).简单工厂模式
第四章作业(二)
(2).工厂方法模式
第四章作业(二)
(3).抽象工厂模式
第四章作业(二)

五、程序实现
(1)简单工厂模式

import java.util.Scanner;

public interface Individuals {  //设置一个造人接口
}
public class Man implements Individuals{  //创造男人类
	public Man() {
		System.out.println("创建了一个男人对象");
	}
}
public class Woman implements Individuals{  //创造女人类
	public Woman() {
		System.out.println("创建了一个女人对象");
	}
}
public class Robot implements Individuals{  //创造机器人类
	public Robot() {
		System.out.println("创建了一个机器人对象");
	}
}
public class Nvwa {   //创建一个女娲类来创建具体对象
	public static Individuals Create(String name) {
		Individuals i = null;
		if(name.equals("M"))
			i = new Man();
		if(name.equals("W"))
			i = new Woman();
		if(name.equals("R"))      //新增创建机器人对象
			i = new Robot();
		return i;
	}
}
public class Test {   //测试类
	public static void main(String[] args) {
		String ch;       //创建具体对象的字符串
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入需要创建的对象编号(M(男人)  W(女人) R(机器人):");
		ch=sc.next();    
		Individuals ni = Nvwa.Create(ch);
		sc.close();
	}
}

(2).工厂方法模式

public interface Product {  //设置一个产品接口
}
public interface Factory {    //设置一个工厂类接口
	public Product Method();  //该方法为工厂实现的抽象方法
}
public class Hair implements Product{  //海尔空调类
	public Hair() {            //用来显示海尔空调创建成功
		System.out.println("生产了一台海尔空调");
	}
}
public class Medea implements Product{  //美的空调类
	public Medea() {             //用来显示美的空调创建成功
		System.out.println("生产了一台美的空调");
	}
}
public class HairFactory implements Factory{  //生产海尔空调的类
	public Product Method() {                 //实现该方法生产海尔空调 
		return new Hair();
	}
}
public class MedeaFactory implements Factory{  //生产美的空调的类
	public Product Method() {                  //实现该方法生产美的空调
		return new Medea();
	}
}
public class Test {   //测试类
	public static void main(String[] args) {
		Product p;    
		p=new HairFactory().Method();  //创建一个海尔空调对象
		p=new MedeaFactory().Method(); //创建一个美的空调对象
	}
}

(3).抽象工程模式

public interface CPU {  //创建一个CPU类接口
}
public interface RAM {      //创建内存类接口
}
public interface Factory {  //设置一个工厂类接口
	public RAM Method1();
	public CPU Method2();
}
public class PcCPU implements CPU{  //生产PcCPU的类
	public PcCPU() {
		System.out.println("生产了一个PcCPU");
	}
}
public class MacCPU implements CPU{  //生产MacCPU的类
	public MacCPU() {
		System.out.println("生产了一个MacCPU");
	}
}
public class PcRAM implements RAM{  //生产PcRAM的类
	public PcRAM() {
		System.out.print("生产了一个PcRAM\t");
	}
}
public class MacRAM implements RAM{  //生产MacRAM的类
	public MacRAM() {
		System.out.print("生产了一个MacRAM\t");
	}
}
public class PcFactory implements Factory{  //该类用于生产Pc的RAM和CPU
	public RAM Method1() {      //创建PcRAM的对象
		return new PcRAM();
	}
	public CPU Method2() {      //创建PcCPU的对象
		return new PcCPU();
	}
}
public class MacFactory implements Factory{  //该类用于生产Mac的RAM和CPU
	public RAM Method1() {     //创建MacRAM的对象
		return new MacRAM();
	}
	public CPU Method2() {     //创建MacCPU的对象
		return new MacCPU();
	}
}
public class Test {   //测试类
	public static void main(String[] args) {
		RAM r;
		CPU c;
		r = new PcFactory().Method1();
		c = new PcFactory().Method2();
		r = new MacFactory().Method1();
		c = new MacFactory().Method2();
	}
}

六、运行结果
(1).简单工厂模式
第四章作业(二)
第四章作业(二)

第四章作业(二)

(2).工厂方法模式
第四章作业(二)

(3).抽象工厂模式
第四章作业(二)
七、个人总结
这次章节作业我对这三种设计模式有了更多的了解,每一种设计模式都有其利弊,要依据不同的实际情况选择更为合适的设计模式。在编写代码的时候遇到的问题基本都是关键字的问题,对于Java的基础编程已经基本掌握。之后我还会对前面做过的上机实验进行修改看一下有没有更适合的设计模式来完成,剩下的二十一种设计模式我也会慢慢看着学习的。