一、题目分析
- 简单工厂模式
使用简单工厂模式模拟女娲(Nvwa)造人(Person),如果传入参数M,则返回一个Man对象,如果传入参数W,则返回一个Woman对象,请实现该场景。现需要增加一个新的Robot类,如果传入参数R,则返回一个Robot对象,对代码进行修改并注意女娲的变化。
- 工厂方法模式
海尔工厂(Haier)生产海尔空调(HaierAirCondition),美的工厂(Midea)生产美的空调(MideaAirCondition) 。使用工厂方法模式描述该场景,绘制类图并编程实现。
- 抽象工程模式
电脑配件生产工厂生产内存、CPU等硬件设备,这些内存、CPU的品牌、型号并不一定相同,根据下面的“产品等级结构-产品族”示意图,使用抽象工厂模式实现电脑配件生产过程并绘制相应的类图,绘制类图并编程实现。
二、类图设计
(1).简单工厂模式
(2). 工厂方法模式
(3). 抽象工厂模式
三、程序实现
(1).简单工厂模式
package MakePeople;
//抽象产品类People
public interface People {
public void makePeople();
}
//具体产品类Man
public class Man implements People{
public void makePeople(){
System.out.println("制造一个男人");
}
}
//具体产品类Woman
public class Women implements People{
public void makePeople(){
System.out.println("制造一个女人");
}
}
//具体产品类Robot
public class Robot implements People{
public void makePeople(){
System.out.println("制造一个机器人");
}
}
//工厂类Nvwa
public class Nvwa {
public static People getpeople(String create){
People people=null;
if(create.equalsIgnoreCase("M")){
people=new Man();
}else if(create.equalsIgnoreCase("W")){
people=new Women();
}else if(create.equalsIgnoreCase("R")){
people=new Robot();
}
return people;
}
}
//客户类Client
public class Client {
public static void main(String[] args) {
People p1,p2,p3;
p1=Nvwa.getpeople("M");
p1.makePeople();
p2=Nvwa.getpeople("W");
p2.makePeople();
p3=Nvwa.getpeople("R");
p3.makePeople();
}
}
(2). 工厂方法模式
package AirCondition;
//抽象产品类AirCondition
public interface AirCondition {
void work();
}
//具体产品类HaierAirCondition
public class HaierAirCondition implements AirCondition{
public void work() {
System.out.println("HaireAirCondition is working!");
}
}
//具体产品类MideaAirCondition
public class MideaAirCondition implements AirCondition{
public void work() {
System.out.println("MideaAirCondition is working!");
}
}
//抽象产品类AirConditionFactory
public interface AirConditionFactory {
AirCondition produceAirCondition();
}
//具体产品类HaierAirConditionFactory
public class HaierAirConditionFactory implements AirConditionFactory{
public HaierAirCondition produceAirCondition() {
System.out.println("HaierAirCondition produced!");
return new HaierAirCondition();
}
}
//具体产品类MideaAirConditionFactory
public class MideaAirConditionFactory implements AirConditionFactory{
public MideaAirCondition produceAirCondition() {
System.out.println("MideaAirCondition produced!");
return new MideaAirCondition();
}
}
//测试类AirConditionClient
public class AirConditionClient {
public static void main(String[] args) {
AirCondition haierCondition,mideaCondition;
AirConditionFactory HaierConditionFactory=new HaierAirConditionFactory();
AirConditionFactory MideaConditionFactory=new MideaAirConditionFactory();
haierCondition = HaierConditionFactory.produceAirCondition();
mideaCondition = MideaConditionFactory.produceAirCondition();
System.out.println();
}
}
(3). 抽象工厂模式
package computer;
//抽象产品类CPU
public interface CPU {
void discribe();
}
//具体产品类PcCPU
public class PcCPU implements CPU{
public void discribe() {
System.out.println("This is produce the PcPCU");
}
}
//具体产品类MacCPU
public class MacCPU implements CPU{
public void discribe() {
System.out.println("This is produce the MacCPU");
}
}
//抽象产品类RAM
public interface RAM {
void discribe();
}
//具体产品类PcRAM
public class PcRAM implements RAM{
public void discribe(){
System.out.println("PcRAM");
}
}
//具体产品类MacRAM
public class MacRAM implements RAM{
public void discribe() {
System.out.println("MacRAM");
}
}
//抽象产品类ComputerPartsFactory
public interface ComputerPartsFactory {
CPU produceCPU();
RAM produceRAM();
}
//具体产品类PcFactory
public class PcFactory implements ComputerPartsFactory{
public PcCPU produceCPU() {
System.out.println("PcCPU produced!");
return new PcCPU();
}
public PcRAM produceRAM() {
System.out.println("PcRAM produced!");
return new PcRAM();
}
}
//具体产品类MacFactory
public class MacFactory implements ComputerPartsFactory{
public MacCPU produceCPU() {
System.out.println("MacCPU produced!");
return new MacCPU();
}
public MacRAM produceRAM() {
System.out.println("MacRAM produced!");
return new MacRAM();
}
}
//测试类ComputerPartsClient
public class ComputerPartsClient {
public static void main(String[] args){
ComputerPartsFactory a=new PcFactory();
ComputerPartsFactory b=new MacFactory();
CPU cpu=a.produceCPU();
RAM ram=b.produceRAM();
cpu.discribe();
ram.discribe();
}
}
四、运行结果
(1).简单工厂模式运行结果:
(2). 工厂方法模式运行结果:
(3). 抽象工厂模式运行结果:
五、归纳经验
简单工厂中只有一个工厂,该工厂有一个创建产品的方法。根据传入参数不同,返回不同产品。在这个模式中,工厂类是整个模式的关键所在。它包含必要的判断逻辑,能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的。有利于整个软件体系结构的优化。当系统中的具体产品类不断增多时,可能会出现要求工厂类也要做相应的修改,扩展性并不很好。
工厂方法模式是对简单工厂的升级,将工厂抽象出来,工厂基类定义创建产品的方法。每个工厂都需要实现该方法。每个产品对应一个工厂,一个工厂只生产对应产品。
抽象工厂模式是对工厂方法模式的升级。抽象工厂模式中的具体工厂不只是创建一种产品,它负责创建一族产品。缺点是增加新的产品等级结构麻烦,需要对原有系统进行较大的修改,甚至需要修改抽象层代码,这显然会带来较大的不便,违背了“开闭原则”。
三个对比来说,简单工厂由于工厂角色身兼多职,造成程序不够灵活和不易拓展,工厂方法新增加一个抽象工厂将工厂类的职责进行拆分,使得程序容易拓展。抽象工厂使得一个工厂能生产多种产品,就是一个产品族。