定义一个食物的接口
package com.tencent.baosen.learnfactory;
/**
* 定义一个食物的接口
*/
public interface IFood {
void eat();
}
定义一个Bread类,实现IFood接口
package com.tencent.baosen.learnfactory;
public class Bread implements IFood{
@Override
public void eat() {
System.out.println("吃块面包");
}
}
定义一个Milk类,实现IFood接口
package com.tencent.baosen.learnfactory;
public class Milk implements IFood{
@Override
public void eat() {
System.out.println("喝杯牛奶");
}
}
定义一个工厂类,产生食物
package com.tencent.baosen.learnfactory;
/**
* 定义一个工厂类,产生食物类
*/
public class FoodFactory {
public static IFood getInstance(String className){
if(className.equals("Bread")){
return new Bread();
}else if(className.equals("Milk")){
return new Milk();
}else {
return null;
}
}
}
客户端只需要向工厂要食物名称即可
package com.tencent.baosen.learnfactory;
/**
* 客户端测试类
*/
public class Test {
public static void main(String[] args) {
IFood food = FoodFactory.getInstance("Bread");
food.eat();
}
}
运行结果:
吃块面包
**************************************我是分割线==================================
使用反射实现动态工厂类
package com.tencent.baosen;
/**
* 动态工厂模式学习
*/
public class Factory {
//工厂模式不需要外部对象实例化,所以构造方法应该是私有化的
private Factory(){}
//构造方法私有化后,该类中的其他方法应该是static才能被外部调用
public static <T> T getInstance(String className, Class<T> clazz){
T instance = null;
try {
//通过反射,将静态工厂类转变成动态工厂类
instance = (T) Class.forName(className).getDeclaredConstructor().newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return instance;
}
}