简单工厂模式
定义
通过一个Factory类获取在这个类下被定义的所有类,获取的类使用者无法看到如何实例化出来的
生活中举例:
客:我要买宝马!!!
商家:您买哪款???
客:我买宝马7系!!!
图解(UML图网上一大堆这里就放个我自己画的)
java代码
接口
/**
* 汽车类
* 工厂模式顶层接口
* 生活中类似于 这款车的品牌是宝马
* @author xiaokun
*/
public interface ICar {
}
枚举类
/**
* 汽车型号枚举
* 例如生活中 宝马6,7,8系
* @author xiaokun
*/
public enum CarType {
BMW6,
BMW7,
BMW8
}
实现类(工厂中的产品)
/**
* BWM6
* 宝马车的具体类型
* @author xiaokun
*/
public class BMW6 implements ICar{
public BMW6() {
System.out.println("我选择了宝马6系");
}
}
/**
* BWM7
* 宝马车的具体类型
* @author xiaokun
*/
public class BMW7 implements ICar{
public BMW7() {
System.out.println("我选择了宝马7系");
}
}
/**
* BWM8
* 宝马车的具体类型
* @author xiaokun
*/
public class BMW8 implements ICar{
public BMW8() {
System.out.println("我选择了宝马8系");
}
}
工厂类(列举了2种内部方式)
/**
* 商家
* 宝马汽车工厂类
* @author xiaokun
*/
public class BMWCarFactoryBuilder {
public static ICar BMWCarFactory(CarType ct) {
/*========================================
* 这是通过枚举方式获取所需要的对象
switch (ct) {
case BMW6: return new BMW6();
case BMW7: return new BMW7();
case BMW8: return new BMW8();
default: return null;
}
===============================================*/
//这里可以通过配置文件达到松耦合的获取对象,这里使用枚举模拟配置文件
ICar car;
try {
car = (ICar) Class.forName("Factory.impl."+ct.name()).getConstructor().newInstance();
} catch (Exception e) {
return null;
}
return car;
}
}
测试类
/**
* 简单工厂测试类
* @author xiaokun
*/
public class Test {
public static void main(String[] args) throws Exception {
//遍历枚举检查工厂类的情况
for(CarType ct : CarType.values())
BMWCarFactoryBuilder.BMWCarFactory(ct);
}
}
测试结果
我选择了宝马6系
我选择了宝马7系
我选择了宝马8系