【设计模式-工厂模式】男男女女的抽象工厂模式

背景

虽然女娲已经成功将人类创造出来了,可是都是没有性别的,那么后续该如何繁衍呢。

为此,除了增加人种外,我们还需要增加所有人类都有的一个属性:性别。

由此:人种和性别相互组合生成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();

    }
}
posted @ 2021-05-14 11:08  澎拜编程  阅读(284)  评论(0)    收藏  举报