java web 系列:工厂模式(代码)

工厂模式理论篇:https://mp.csdn.net/postedit/96699960

代码模拟植物大战僵尸的植物生产过程

路径

1.创建植物接口Plant

public interface Plant {
    public String getName();
    public void fight();

}

2.创建植物基本特征(武器,头发等等)

public class Arms {
    private String bulletType;

    public String getBulletType() {
        return bulletType;
    }

    public void setBulletType(String bulletType) {
        this.bulletType = bulletType;
    }
}
public class Hair {
    private String color;

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }
}
package org.imooc.component;

public class Shell {
    private Integer hardness;

    public Integer getHardness() {
        return hardness;
    }

    public void setHardness(Integer hardness) {
        this.hardness = hardness;
    }
}

 3.植物继承接口和创建属性

public class Ice implements Plant{
    private Hair hair;
    private Arms arms;
    public String getName(){return "蓝冰";}
    public void fight(){
        System.out.println("发射一颗冰豆");
    }

    public Hair getHair() {
        return hair;
    }

    public void setHair(Hair hair) {
        this.hair = hair;
    }

    public Arms getArms() {
        return arms;
    }

    public void setArms(Arms arms) {
        this.arms = arms;
    }
}

 其他三个类似

4.定义类路径,方便通过反射直接调用和修改

public class PlantNameConstant {
    /**
     * 绿豆
     */
    public static final String BEAN_NAME="org.imooc.factory.BeanFactory";
    /**
     * 冰豆
     */
    public static final String ICE_NAME="org.imooc.factory.IceFactory";
    /**
     * 果墙
     */
    public static final String WALL_NAME="org.imooc.factory.WallFactory";
}

 5.创建生产冰豆的工厂

public class IceFactory implements Factory{
    public Plant createPlant(){
        Ice ice=new Ice();
        Hair hair=new Hair();
        hair.setColor("蓝色");
        ice.setHair(hair);

        Arms arms=new Arms();
        arms.setBulletType("普通的豆子");
        ice.setArms(arms);

        return ice;
    }
}

6.通过反射将指定一个工厂

public class FactoryBuilder {
//通过路径名称指定工厂
//    public  static Factory build(String name){
//        Factory factory=null;
//        if (PlantNameConstant.BEAN_NAME.equals(name)) {
//factory=new BeanFactory();
//
//        }else if (PlantNameConstant.ICE_NAME.equals(name)){
//            factory=new IceFactory();
//
//        }else if (PlantNameConstant.WALL_NAME.equals(name)){
//            factory=new WallFactory();
//        }
//        return factory;
//    }

    //通过反射指定一个工厂
    public static Factory buildByClassName(String name) throws Exception{
        return (Factory)Class.forName(name).newInstance();
    }
}

7.抽出调用工厂方法进行解耦,相同代码可重复利用

public class Function {
    public void put(String name, int number) throws Exception {
        //指定工厂,例如BeanFactory等
        Factory factory= FactoryBuilder.buildByClassName(name);
        //利用工厂生产植物
        Plant plant= factory.createPlant();

        System.out.println("将"+plant.getName()+"放在"+number+"号草地上");
        plant.fight();
    }
}

 8.测试

public class MyMain {
    public static void main(String[] args) throws Exception {
        Function function=new Function();
        function.put(PlantNameConstant.BEAN_NAME, 8);
        function.put(PlantNameConstant.ICE_NAME, 15);
        function.put(PlantNameConstant.WALL_NAME, 9);

    }
}

9.结果

将绿豆放在8号草地上
发射一颗豆子
将蓝冰放在15号草地上
发射一颗冰豆
将果墙放在9号草地上
稳稳的站在草地上
 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值