工厂模式理论篇: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号草地上
稳稳的站在草地上