1.定义抽象工厂接口,具体工厂实现抽象工厂接口,该类工厂生产同一父类的不同子类实例
2.业务背景
在工厂模式中,女娲造人只造了三类人:黄色人种,白色人种和黑色人种,但是没有分为男女性别,现在要创造三类人的男人和女人。
3.
4.定义人类接口
public interface Human {
// 首先定义什么是人类
//人是愉快的,会笑的;
public void laugh();
// 人类还会哭,代表痛苦
public void cry();
// 人类会说话
public void talk();
// 定义性别
public void sex();
}
5.创建三个抽象类(黄色人种、白色人种、黑色人种)
public abstract class AbstractYellowHuman implements Human {
public void cry() {System.out.println("黄色人类会哭" );}
public void laugh() {System.out.println("黄色人类会大笑" ); }
public void talk() {System.out.println("黄色人类会说话,一般说的都是双字节" ); }
}
public abstract class AbstractWhiteHuman implements Human {
public void cry() {System.out.println("白色人类会哭" );}
public void laugh() {System.out.println("白色人类会大笑" );}
public void talk() {System.out.println("白色人类会说话,一般都是但是单字节!" ); }
}
public abstract class AbstractBlackHuman implements Human {
public void cry() {System.out.println("黑人会哭" );}
public void laugh() {System.out.println("黑人会笑" );}
public void talk() {System.out.println("黑人可以说话,一般人听不懂" );}
}
6.再定义(黄色人种、白色人种、黑色人种)男女类
public class YellowFemaleHuman extends AbstractYellowHuman {
publicvoid sex() {System.out.println("该黄种人的性别为女..." );}
}
public class YellowMaleHuman extends AbstractYellowHuman {
publicvoid sex() {System.out.println("该黄种人的性别为男...." );}
}
public class WhiteFemaleHuman extends AbstractWhiteHuman {
publicvoid sex() {System.out.println("该白种人的性别为女...." );}
}
public class WhiteMaleHuman extends AbstractWhiteHuman {
public voidsex() {System.out.println("该白种人的性别为男...." ); }
}
public class BlackFemaleHuman extends AbstractBlackHuman {
publicvoid sex() {System.out.println("该黑种人的性别为女..." );}
}
public class BlackMaleHuman extends AbstractBlackHuman {
public void sex() {System.out.println("该黑种人的性别为男..." );}
}
7.人类枚举类
public enum HumanEnum {
// 把世界上所有人类型都定义出来
YelloMaleHuman("com.cbf4life.yellowHuman.YellowMaleHuman" ),
YelloFemaleHuman("com.cbf4life.yellowHuman.YellowFemaleHuman" ),
WhiteFemaleHuman("com.cbf4life.whiteHuman.WhiteFemaleHuman" ),
WhiteMaleHuman("com.cbf4life.whiteHuman.WhiteMaleHuman" ),
BlackFemaleHuman("com.cbf4life.blackHuman.BlackFemaleHuman" ),
BlackMaleHuman("com.cbf4life.blackHuman.BlackMaleHuman" );
private String value = "" ;
//定义构造函数,目的是Data(value) 类型的相匹配
private HumanEnum(String value){this.value = value;}
public String getValue(){return this.value ;}
}
抽象工厂模式下的产品等级和产品族都已经完成,也就是人类以及产生出的人类是什么样子的都已经 定义好了,下一步就等着工厂开工创建了
8.创建人类工厂接口
public interface HumanFactory {
// 制造黄色人类
public Human createYellowHuman();
// 制造一个白色人类
public Human createWhiteHuman();
// 制造一个黑色人类
public Human createBlackHuman();
}
9.人类工厂抽象类实现人类工厂接口
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;
}
}
10.男性工厂
public class MaleHumanFactory extends AbstractHumanFactory {
// 创建一个男性黑种人
public Human createBlackHuman() {return super.createHuman(HumanEnum.BlackMaleHuman );}
// 创建一个男性白种人
public Human createWhiteHuman() {return super.createHuman(HumanEnum.WhiteMaleHuman );}
// 创建一个男性黄种人
public Human createYellowHuman() {return super.createHuman(HumanEnum.YelloMaleHuman );}
}
11.女性工厂
public class FemaleHumanFactory extends AbstractHumanFactory {
// 创建一个女性黑种人
public Human createBlackHuman() {return super.createHuman(HumanEnum.BlackFemaleHuman );}
// 创建一个女性白种人
public Human createWhiteHuman() {return super.createHuman(HumanEnum.WhiteFemaleHuman );}
// 创建一个女性黄种人
public Human createYellowHuman() {return super.createHuman(HumanEnum.YelloFemaleHuman );}
}
12.女娲开始造人了
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();
/** .....* 后面你可以续了*/
}
}
网友评论