实验三 创建型设计模式
一、实验目的
1、掌握简单工厂模式基本结构;
2、掌握工厂模式结构与实现;
3、掌握抽象工厂模式的结构与实现;
4、理解简单工厂模式、工厂模式、抽象工厂模式的不同应用场景;
二、实验原理
1、简单工厂模式的原理
工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。
2、抽象工厂模式的基本结构如下图:
抽象工厂模式中的具体工厂不只是创建一种产品,它负责创建一族产品。当一个工厂等级结构,可以创建出分属于不同产品等级结构的一个产品族中的所有对象时,抽象工厂模式比工厂方法模式更为简单、更有效率。
三、实验内容
题目一:使用简单工厂模式模拟女娲(Nvwa
)造人(Person
),如果传入参数“M”,则返回一个 Man
对象,如果传入参数“W”,则返回一个 Woman
对象。现需要增加一个新的Robot类,如果传入参数“R”,则返回一个Robot对象,对代码进行修改并注意“女娲”的变化。
[实验步骤]
(1)分析案例,采用简单工厂模式设计类图,确定简单工厂模式的角色。
(2)分析得到如下类图:
(3) 分析得到 Nvwa
类充当工厂类,其中定义了工厂方法 makePerson()
,Person
类充当抽象产品类,Man
、Woman
和 Robot
充当具体产品类。
(4) 完成全部代码,编译并运行结果。
题目一实验结果
画出的UML图如下所示:
Nvwa.java
public class Nvwa {
public Nvwa() {
}
public void finalize() throws Throwable {
}
public Person makePerson(char arg) {
switch (arg) {
case 'M':
return new Man();
case 'W':
return new Woman();
case 'R':
return new Robot();
default:
return null;
}
}
}
Person.java(接口)
public interface Person {
public void eat();
public void sleep();
}
Robot.java
public class Robot implements Person {
public Robot(){
}
public void finalize() throws Throwable {
}
public void eat(){
System.out.println("机器人吃东西");
}
public void sleep(){
System.out.println("机器人睡觉");
}
}
Woman.java
public class Woman implements Person {
public Woman(){
}
public void finalize() throws Throwable {
}
public void eat(){
System.out.println("女人吃东西");
}
public void sleep(){
System.out.println("女人睡觉");
}
}
Man.java
public class Man implements Person {
public Man(){
}
public void finalize() throws Throwable {
}
public void eat(){
System.out.println("男人吃东西");
}
public void sleep(){
System.out.println("男人睡觉");
}
}
Client.java(测试类)
public class Client {
public static void main(String[] args) {
Nvwa nvwa = new Nvwa();
Person man = nvwa.makePerson('M');
man.eat();
man.sleep();
Person woman = nvwa.makePerson('W');
woman.eat();
woman.sleep();
Person robot = nvwa.makePerson('R');
robot.eat();
robot.sleep();
}
}
结果
男人吃东西
男人睡觉
女人吃东西
女人睡觉
机器人吃东西
机器人睡觉
题目二:计算机包含内存(RAM)、CPU等硬件设备,根据下面的“产品等级结构-产品族”示意图,使用抽象工厂模式实现计算机设备创建过程并绘制相应的类图。
[实验步骤]
(1) 分析案例,采用抽象工厂模式设计类图,确定抽象工厂模式的角色。
(2) 分析确定类图。
分析题目需求
- 题目要求使用抽象工厂模式实现计算机(包含 CPU、RAM 等硬件设备)创建过程,并绘制相应类图。
- 首先需要确定抽象工厂、具体工厂、抽象产品和具体产品这几个角色。
确定角色
- 抽象工厂(ComputerFactory):定义了创建
CPU
和RAM
的抽象方法CreateCPU()
和CreateRAM()
,这符合抽象工厂模式中抽象工厂的角色。 - 具体工厂(PCBuilder 和 MacBuilder):分别实现了
ComputerFactory
接口,并且具体实现了CreateCPU()
和CreateRAM()
方法来创建对应的产品,这是具体工厂的典型实现。 - 抽象产品(CPU 和 RAM 接口):都定义了
display()
方法,虽然方法体是void
,但这符合抽象产品定义产品行为的特点。 - 具体产品(PcCPU、MacCPU、PcRAM、MacRAM):分别实现了
CPU
和RAM
接口中的display()
方法,这是具体产品对抽象产品功能的实现。
题目二实验结果
画出的UML图如下所示:
ComputerFactory.java(接口)
public interface ComputerFactory {
public CPU CreateCPU();
public RAM CreateRAM();
}
MacBuilder.java
public class MacBuilder implements ComputerFactory {
public MacBuilder(){
}
public void finalize() throws Throwable {
}
public CPU CreateCPU(){
return new MacCPU();
}
public RAM CreateRAM(){
return new MacRAM();
}
}
PCBuilder.java
public class PCBuilder implements ComputerFactory {
public PCBuilder(){
}
public void finalize() throws Throwable {
}
public CPU CreateCPU(){
return new PcCPU();
}
public RAM CreateRAM(){
return new PcRAM();
}
}
PcRAM.java
public class PcRAM implements RAM {
public PcRAM(){
}
public void finalize() throws Throwable {
}
public void display(){
System.out.println("我是PcRAM");
}
}
PcCPU.java
public class PcCPU implements CPU {
public PcCPU(){
}
public void finalize() throws Throwable {
}
public void display(){
System.out.println("我是PcCPU");
}
}
MacCPU.java
public class MacCPU implements CPU {
public MacCPU(){
}
public void finalize() throws Throwable {
}
public void display(){
System.out.println("我是MacCPU");
}
}
MacRAM.java
public class MacRAM implements RAM {
public MacRAM(){
}
public void finalize() throws Throwable {
}
public void display(){
System.out.println("我是MacRAM");
}
}
CPU.java(接口)
public interface CPU {
public void display();
}
RAM.java(接口)
public interface RAM {
public void display();
}
测试类Main.java
public class Main {
public static void main(String[] args) {
ComputerFactory macFactory = new MacBuilder();
CPU macCPU = macFactory.CreateCPU();
RAM macRAM = macFactory.CreateRAM();
macCPU.display();
macRAM.display();
ComputerFactory pcFactory = new PCBuilder();
CPU pcCPU = pcFactory.CreateCPU();
RAM pcRAM = pcFactory.CreateRAM();
pcCPU.display();
pcRAM.display();
}
}
结果
我是MacCPU
我是MacRAM
我是PcCPU
我是PcRAM
评论区