您的位置:首页 > 编程语言 > Java开发

java设计模式-工厂模式

2017-09-27 09:40 375 查看
一 工厂模式

1 //首先定义一个人的接口 定义人都能干什么

public interface Ren {

    //人会大笑

    public void laugh();

    //人会哭

    public void cry();

    //人会说话

    public void talk();
}

2 定义一个黑人 实现人的接口

public class HeiRen implements Ren {

    @Override

    public void laugh() {

        // TODO Auto-generated method stub

        System.out.println("黑人  正在大笑");

    }

    @Override

    public void cry() {

        // TODO Auto-generated method stub

        System.out.println("黑人  正在伤心的哭");

    }

    @Override

    public void talk() {

        // TODO Auto-generated method stub

        System.out.println("黑人  正在说话");

    }

}

3 定义一个白人实现人的接口

public class BaiRen implements Ren {

    @Override

    public void laugh() {

        // TODO Auto-generated method stub

        System.out.println("白种人 正在大笑");

    }

    @Override

    public void cry() {

        // TODO Auto-generated method stub

        System.out.println("白种人 正在伤心的哭");

    }

    @Override

    public void talk() {

        // TODO Auto-generated method stub

        System.out.println("白种人 正在说话");

    }

}

4定义一个工厂 确认工厂的能做什么

public class LuZi {

    //定义一个克隆机器

    public static Ren getFactory(Class c) {

        Ren ren = null;//定义一个人

        try {

            ren = (Ren) Class.forName(c.getName()).newInstance();

        } catch (InstantiationException e) {

            // TODO Auto-generated catch block

            //你要是不说个人种颜色的话,没法烤,要白的,你说话了才好烤

            System.out.println("必须指定人种的颜色");

            e.printStackTrace();

        } catch (IllegalAccessException e1) {

            // TODO: handle exception

            //定义的人种有问题,那就烤不出来了,这是...

            System.out.println("指定人种的有问题");

            e1.printStackTrace();

        } catch (ClassNotFoundException e2) {

            // TODO: handle exception

            System.out.println("指定人种的有问题");

            e2.printStackTrace();

        }

        return ren;

    }

}

5 开始使用工厂

public class NvWa {

    public static void main(String[] args) {

        Ren ren = LuZi.getFactory(BaiRen.class);

        ren.cry();

    }

}

二 抽象工厂模式 -该模式

1首先定义一个人的接口

public interface Ren {

    //首先定义什么是人类

    //人是愉快的,会笑的,本来是想用smile表示,想了一下laugh更合适,好长时间没有大笑了;

    public void laugh();

    //人类还会哭,代表痛苦

    public void cry();

    //人类会说话

    public void talk();

    //定义性别

    public void sex();

}

2然后定义人种抽象类型

// 然后根据接口创建三个抽象类 也就是三个产品等级 定义一个人种

public abstract class AbstractBaiRen implements Ren {

    @Override

    public void laugh() {

        // TODO Auto-generated method stub

        System.out.println("白人会笑");

    }

    @Override

    public void cry() {

        // TODO Auto-generated method stub

        System.out.println("白人会哭");

    }

    @Override

    public void talk() {

        // TODO Auto-generated method stub

        System.out.println("白人会说话");

    }

}

// 然后根据接口创建三个抽象类 也就是三个产品等级 定义一个人种

public abstract class AbstractHeiRen implements Ren {

    @Override

    public void laugh() {

        // TODO Auto-generated method stub

        System.out.println("白人会笑");

    }

    @Override

    public void cry() {

        // TODO Auto-generated method stub

        System.out.println("白人会哭");

    }

    @Override

    public void talk() {

        // TODO Auto-generated method stub

        System.out.println("白人会说话");

    }

}

3定义具体的人

public class BaiNanRen extends AbstractBaiRen {

    @Override

    public void sex() {

        // TODO Auto-generated method stub

        System.out.println("白种人 男");

    }

}

public class BaiNvRen extends AbstractBaiRen {

    @Override

    public void sex() {

        // TODO Auto-generated method stub

        System.out.println("白种人 女");

    }

}

public class HeiNanRen extends AbstractHeiRen {

    @Override

    public void sex() {

        // TODO Auto-generated method stub

        System.out.println("黑种人 男");

    }

}

public class HeiNvRen extends AbstractHeiRen {

    @Override

    public void sex() {

        // TODO Auto-generated method stub

        System.out.println("黑种人 女");

    }

}

4定义一个克隆机

public interface LuZiFactory {

    //制造黄色人种

    public Ren createYellowHuman();

    //制造一个白色人种

    public Ren createWhiteHuman();

    //制造一个黑色人种

    public Ren createBlackHuman();

}

克隆机抽象类

public abstract class AbstrsctLuZiFactory implements LuZiFactory {

    /*

     * 给定一个性别人种,创建一个人类出来 专业术语是产生产品等级

     */

    protected Ren createHuman(HumanEnum humanEnum) {

        Ren human = null;

        //如果传递进来不是一个Enum中具体的一个Element的话,则不处理

        if (!humanEnum.getValue().equals("")) {

            try {

                //直接产生一个实例

                human = (Ren) Class.forName(humanEnum.getValue()).newInstance();

            } catch (Exception e) {

                //因为使用了enum,这个种异常情况不会产生了,除非你的enum有问题;

                e.printStackTrace();

            }

        }

        return human;

    }

}

5定义一个具体克隆机 克隆男性

public class NanLuZiFactory extends AbstrsctLuZiFactory {

    //创建一个男性黑种人

    public Ren createBlackHuman() {

        return super.createHuman(HumanEnum.BlackMaleHuman);

    }

    //创建一个男性白种人

    public Ren createWhiteHuman() {

        return super.createHuman(HumanEnum.WhiteMaleHuman);

    }

    //创建一个男性黄种人

    public Ren createYellowHuman() {

        return super.createHuman(HumanEnum.YelloMaleHuman);

    }

}

克隆女性

public class NvLuZiFactory extends AbstrsctLuZiFactory {

    //创建一个女性黑种人

    public Ren createBlackHuman() {

        return super.createHuman(HumanEnum.BlackFemaleHuman);

    }

    //创建一个女性白种人

    public Ren createWhiteHuman() {

        return super.createHuman(HumanEnum.WhiteFemaleHuman);

    }

    //创建一个女性黄种人

    public Ren createYellowHuman() {

        return super.createHuman(HumanEnum.YelloFemaleHuman);

    }

}

开始克隆

public class NvWaTestMain {

    public static void main(String[] args) {

        //第一条生产线,男性生产线

        LuZiFactory maleHumanFactory = new NanLuZiFactory();

        //第二条生产线,女性生产线

        LuZiFactory femaleHumanFactory = new NvLuZiFactory();

        //生产线建立完毕,开始生产人了:

        Ren maleYellowHuman = maleHumanFactory.createYellowHuman();

        Ren femaleYellowHuman = femaleHumanFactory.createYellowHuman();

        maleYellowHuman.cry();

        maleYellowHuman.laugh();

        femaleYellowHuman.sex();

        /*

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

         */

    }

}

定义人种枚举

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;

    }

    /*

     * java enum类型尽量简单使用,尽量不要使用多态、继承等方法 毕竟用Clas完全可以代替enum

     */

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: