美文网首页
设计模式之禅-抽象工厂模式

设计模式之禅-抽象工厂模式

作者: 凉快先生 | 来源:发表于2020-12-22 09:58 被阅读0次

    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(); 

    /** .....* 后面你可以续了*/

    }

    }

    相关文章

      网友评论

          本文标题:设计模式之禅-抽象工厂模式

          本文链接:https://www.haomeiwen.com/subject/hpmjnktx.html