【设计模式-工厂模式】男男女女的抽象工厂模式
背景
虽然女娲已经成功将人类创造出来了,可是都是没有性别的,那么后续该如何繁衍呢。
为此,除了增加人种外,我们还需要增加所有人类都有的一个属性:性别。
由此:人种和性别相互组合生成6中不同的人类
男黑人、女黑人、男白人、女白人、男黄人、女黄人
原来的一个八卦炉也需要进行修改,变为专门生产男性的"男八卦炉" 和专门生产女性的 “女八卦炉”
类图
可以看到我们在原有的几个人种上,又重新继承并实现了两个类,分别用于表示不同人种的男女
特别说明的是HumanFactory接口,在这个接口中定义了三个方法,分别用于生产不同的肤色的人种,也就是我们将肤色作为Y轴,性别作为X轴,通过X坐标和Y坐标唯一确定一个生产出来的对象。
代码
人种接口
public interface Human {
//每个人种的皮肤都是不同的颜色
public void getColor();
//每个人类都会发声
public void talk();
public void getSex();
}
人种接口即抽象产品,该产品的共同属性定义:肤色和语言,而性别则是不同产品下更深层的细分
实现人种接口的黄种人
public abstract class AbstractYellowHuman implements Human{
@Override
public void getColor() {
System.out.println("黄种人");
}
@Override
public void talk() {
System.out.println("国语");
}
}
继承了该接口的抽象黄种人类,每个抽象类都会实现产品的公共细节,而每个抽象类的都会有两个实现类,分别实现各自的不同的细节:性别
黄种人女性
public class YellowWoman extends AbstractYellowHuman{
@Override
public void getSex() {
System.out.println("YellowWoman");
}
}
八卦炉
/**
* 产品类
* 有N个产品组,在抽象工厂类中就应该有N个创建方法;
* 每个产品有M个产品扩展维度就应该有M个产品实现工厂类,
* 在每个实现工厂中,实现不同的产品族的生产任务.
* @author LiPeng01
* @since 2020/8/8 7:31 下午
*/
public interface HumanFactory {
public Human doYellowHuman();
public Human doWhiteHuman();
public Human doBlackHuman();
}
在接口中我们可以看到 抽象的工厂是可以生产出不同肤色的人种的。而各色人种的性别则是通过对抽象工厂的进一步细化。举个例子,原本工厂里只生产3种类型的商品,现在需要为各个商品再添加青春版和奢华版,那么我们需要在各个产品线的基础上再添加 两个不同的生产线,用于生产不同版本的商品。
女性八卦炉
public class WomanFactory implements HumanFactory{
@Override
public Human doYellowHuman() {
return new YellowWoman();
}
@Override
public Human doWhiteHuman() {
return new WhiteWoman();
}
@Override
public Human doBlackHuman() {
return new BlackWoman();
}
}
女娲造人
现在已经有了不同类型的八卦炉用于生产不同人种的不同性别,那么女娲造人的流程现在如下
public class NvWa {
public static void main(String[] args) {
//第一条生产线,男性生产线
HumanFactory manFactory = new ManFactory();
//男性黑人
Human blackMan = manFactory.doBlackHuman();
//男性白人
Human whiteMan = manFactory.doWhiteHuman();
//男性黄人
Human yellowMan = manFactory.doYellowHuman();
blackMan.getSex();
whiteMan.getSex();
yellowMan.getSex();
//第二个生产线,生产女性
HumanFactory womanFactory = new WomanFactory();
//女性黑人
Human blackWoman = womanFactory.doBlackHuman();
//女性白人
Human whiteWoman = womanFactory.doWhiteHuman();
//女性黄人
Human yellowWoman = womanFactory.doYellowHuman();
blackWoman.getSex();
whiteWoman.getSex();
yellowWoman.getSex();
}
}

浙公网安备 33010602011771号