参考:设计模式之禅
目录
抽象工厂模式
好了,我们继续上一节课,上一节讲到女娲造人,人是造出来了,世界时热闹了,可是低头一看,都
是清一色的类型,缺少关爱、仇恨、喜怒哀乐等情绪,人类的生命太平淡了,女娲一想,猛然一拍脑袋,
Shit!忘记给人类定义性别了,那怎么办?抹掉重来,然后就把人类重新洗牌,准备重新开始制造人类。
由于先前的工作已经花费了很大的精力做为铺垫,也不想从头开始了,那先说人类(Product 产品类)
怎么改吧,好,有了,给每个人类都加一个性别,然后再重新制造,这个问题解决了,那八卦炉怎么办?
只有一个呀,要么生产出全都是男性,要不都是女性,那不行呀,有了,把已经有了一条生产线——八卦
炉(工厂模式中的 Concrete Factory)拆开,于是女娲就使用了“八卦拷贝术”,把原先的八卦炉一个变两
个,并且略加修改,就成了女性八卦炉(只生产女性,一个具体工厂的实现类)和男性八卦炉(只生产男
性,又一个具体工厂的实现类)
类图
略
实现
1. 定义人类
package DesignModel_6;
public interface Human {
//首先定义什么是人类
//人是愉快的,会笑的
void laugh();
//人类还会哭,代表痛苦
void cry();
//人类会说话
void talk();
//定义性别
void sex();
}
2. 定义黄色人类抽象类
package DesignModel_6;
public class AbstractYellowHuman implements Human{
@Override
public void laugh() {
System.out.println("黄色人类会大笑,幸福呀!");
}
@Override
public void cry() {
System.out.println("黄色人类会哭");
}
@Override
public void talk() {
System.out.println("黄色人类会说话,一般说的都是双字节");
}
@Override
public void sex() {
}
}
3. 定义白色人类抽象类
package DesignModel_6;
public class AbstractWhiteHuman implements Human {
@Override
public void laugh() {
System.out.println("白色人类会大笑,侵略的笑声");
}
@Override
public void cry() {
System.out.println("白色人类会哭");
}
@Override
public void talk() {
System.out.println("白色人类会说话,一般都是但是单字节!");
}
@Override
public void sex() {
}
}
4. 定义黑人人类抽象类
package DesignModel_6;
public class AbstractBlackHuman implements Human {
@Override
public void laugh() {
System.out.println("黑人会笑");
}
@Override
public void cry() {
System.out.println("黑人会哭");
}
@Override
public void talk() {
System.out.println("黑人可以说话,一般人听不懂");
}
@Override
public void sex() {
}
}
5. 定义女性黄种人
package DesignModel_6;
public class YellowFemaleHuman extends AbstractYellowHuman{
@Override
public void sex() {
System.out.println("该黄种人的性别为女...");
}
}
6. 定义男性黄种人
package DesignModel_6;
public class YellowMaleHuman extends AbstractYellowHuman {
@Override
public void sex() {
System.out.println("该黄种人的性别为男....");
}
}
7. 定义女性白种人
package DesignModel_6;
public class WhiteFemaleHuman extends AbstractWhiteHuman {
@Override
public void sex() {
System.out.println("该白种人的性别为女....");
}
}
8. 定义男性白种人
package DesignModel_6;
public class WhiteMaleHuman extends AbstractWhiteHuman {
@Override
public void sex() {
System.out.println("该白种人的性别为男....");
}
}
9. 定义女性黑种人
package DesignModel_6;
public class BlackFemaleHuman extends AbstractBlackHuman {
@Override
public void sex() {
System.out.println("该黑种人的性别为女...");
}
}
10. 定义男性黑种人
package DesignModel_6;
public class BlackMaleHuman extends AbstractBlackHuman {
@Override
public void sex() {
System.out.println("该黑种人的性别为男...");
}
}
11. 世界上有哪些类型的人,列出来
package DesignModel_6;
public enum HumanEnum {
//把世界上所有人类型都定义出来
YelloMaleHuman("DesignModel_6.YellowMaleHuman"),
YelloFemaleHuman("DesignModel_6.YellowFemaleHuman"),
WhiteFemaleHuman("DesignModel_6.WhiteFemaleHuman"),
WhiteMaleHuman("DesignModel_6.WhiteMaleHuman"),
BlackFemaleHuman("DesignModel_6.BlackFemaleHuman"),
BlackMaleHuman("DesignModel_6.BlackMaleHuman");
private String value = "";
//定义构造函数,目的是Data(value)类型的相匹配
private HumanEnum(String value){
this.value = value;
}
public String getValue(){
return this.value;
}
/*
* java enum类型尽量简单使用,尽量不要使用多态、继承等方法
* 毕竟用Clas完全可以代替enum
*/
}
12. 定义八卦炉
package DesignModel_6;
public interface HumanFactory {
//制造黄色人类
Human createYellowHuman();
//制造一个白色人类
Human createWhiteHuman();
//制造一个黑色人类
Human createBlackHuman();
}
13. 定义抽象人类工厂
package DesignModel_6;
public abstract class AbstractHumanFactory implements HumanFactory {
/*
* 给定一个性别人类,创建一个人类出来 专业术语是产生产品等级
*/
protected Human createHuman(HumanEnum humanEnum) {
Human human = null;
//如果传递进来不是一个Enum中具体的一个Element的话,则不处理
if (!humanEnum.getValue().equals("")) {
try {
//直接产生一个实例
human = (Human)
Class.forName(humanEnum.getValue()).newInstance();
} catch (Exception e) {
//因为使用了enum,这个种异常情况不会产生了,除非你的enum有问题;
e.printStackTrace();
}
}
return human;
}
}
14. 定义男性创建工厂
package DesignModel_6;
public class MaleHumanFactory extends AbstractHumanFactory {
@Override
public Human createYellowHuman() {
return super.createHuman(HumanEnum.YelloMaleHuman);
}
@Override
public Human createWhiteHuman() {
return super.createHuman(HumanEnum.WhiteMaleHuman);
}
@Override
public Human createBlackHuman() {
return super.createHuman(HumanEnum.BlackMaleHuman);
}
}
15. 定义女性创建工厂
package DesignModel_6;
import DesignModel_6.HumanEnum;
public class FemaleHumanFactory extends AbstractHumanFactory {
@Override
public Human createYellowHuman() {
return super.createHuman(HumanEnum.YelloFemaleHuman);
}
@Override
public Human createWhiteHuman() {
return super.createHuman(HumanEnum.WhiteFemaleHuman);
}
@Override
public Human createBlackHuman() {
return super.createHuman(HumanEnum.BlackFemaleHuman);
}
}
16. 定义女娲
package DesignModel_6;
public class NvWa {
public static void main(String[] args) {
//第一条生产线,男性生产线
HumanFactory maleHumanFactory = new MaleHumanFactory();
//第二条生产线,女性生产线
HumanFactory femaleHumanFactory = new FemaleHumanFactory();
//生产线建立完毕,开始生产人了:
Human maleYellowHuman = maleHumanFactory.createYellowHuman();
Human femaleYellowHuman = femaleHumanFactory.createYellowHuman();
maleYellowHuman.cry();
maleYellowHuman.laugh();
femaleYellowHuman.sex();
/*
* .....
* 后面你可以续了
*/
}
}
运行结果
黄色人类会哭
黄色人类会大笑,幸福呀!
该黄种人的性别为女...