导语
简单工厂又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一。如果从设计模式分类的角度应该分在创建型。
定义
简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类。
优缺点
优点
只需要传入一个正确的参数,就可以获取所需要的对象,而无需知道创建细节。
缺点
工厂类的职责相对过重,增加新的产品需要修改工厂类的判断逻辑,违背了开闭原则。
代码示例
example1
使用简单工厂模拟生产奔驰车和宝马车的例子
代码详见 访问链接
UML类图
image.png/**
* @Description: 具体的将要生产的 奔驰汽车
*/
public class BenzCar extends Car {
@Override
public void produce() {
System.out.println("一辆 【奔驰】 汽车生产出来了!");
}
}
/**
* @Description: 具体的将要生产的 宝马汽车
*/
public class BMWCar extends Car {
@Override
public void produce() {
System.out.println("一辆 【宝马】 汽车生产出来了!");
}
}
/**
* @Description: 使用简单工厂设计模式
*/
public class CarFactory {
/**
* @Description: 这种方式如果扩展的话,需要增加新的 if/else 的判断
* 违反了开闭原则
*
* 相对对应的解决违反开闭原则的方式可以使用反射,
* 如: produceByReflection()
*/
public Car produce(String carType){
if("benz".equalsIgnoreCase(carType)){
System.out.println("一辆 【奔驰】 汽车生产出来了!");
return new BenzCar();
} else if ("bmw".equalsIgnoreCase(carType)) {
System.out.println("一辆 【宝马】 汽车生产出来了!");
return new BMWCar();
} else {
System.out.println("所传车辆类型工厂当前无法建造!");
return null;
}
}
/**
* @Description: 通过反射创建对象,一定程度上遵守了开闭原则
* todo 这种通过Class当作如参的方式有待细究
*/
public static Car produceByReflection(Class calzz){
try {
Car car = (Car)Class.forName(calzz.getName()).newInstance();
return car;
} catch (InstantiationException e) {
System.out.println("发生异常," + e);
} catch (IllegalAccessException e) {
System.out.println("发生异常," + e);
} catch (ClassNotFoundException e) {
System.out.println("发生异常," + e);
}
return null;
}
}
/**
* @Description: 测试类
*/
public class Test {
public static void main(String[] args) {
testUseSimpleFactoryAfter();
// testUseSimpleFactoryAfterByReflection();
}
/**
* @Description: 使用 简单工厂后的调用方法演示
*/
public static void testUseSimpleFactoryAfter(){
CarFactory carFactory = new CarFactory();
carFactory.produce("benz");
carFactory.produce("bmw");
}
/**
* @Description: 使用 简单工厂后,通过反射创建新的对象
*/
public static void testUseSimpleFactoryAfterByReflection(){
Car benzCar = CarFactory.produceByReflection(BenzCar.class);
benzCar.produce();
Car bmwCar = CarFactory.produceByReflection(BMWCar.class);
bmwCar.produce();
}
}
example2
简易计算器的例子
代码详见 访问链接
UML图
UML类图图示样例
大话设计模式 正文P12接口示例解释
大话设计模式 正文P13应用场景
spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得bean对象,但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定。
网友评论