简单工厂模式,虽然不在23种设计模式中。但是可以认为是工厂模式的一种特殊实现,并且在日常中使用广泛,所以还是值得我们去学习的。
解释
- 简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,是一种创建型的设计模式,关注于实例对象创建。
- 由一个工厂对象通过判断传入的参数,决定创建出哪一种产品类的实例,将创建的细节透明化
优点:
- 一个调用者想创建一个对象,只要知道其名称就可以了
- 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。 3、屏蔽产品的具体实现,调用者只关心产品的接口
缺点:
工厂类的职责相对过重,增加新的产品需要修改工厂类的判断逻辑,违背开闭原则,如果产品数量过多,维护将变得非常困难。
列子实现:
模拟场景:
现在汽车品牌千千万...我才不知你要那辆...
UML图:
基础的汽车类:
public interface BaseCar {
/**
* 开车...
*/
void driving();
}
宝马:
public class BMWCar implements BaseCar{
@Override
public void driving() {
System.out.println("BMW开车……");
}
}
奔驰:
public class MercedesCar implements BaseCar{
@Override
public void driving() {
System.out.println("Mercedes开车……");
}
}
汽车简单工厂类:
public class CarFactory {
/**
*
* @param carName 汽车品牌名称
* @return 汽车品牌类型
*/
public BaseCar getCar(String carName){
if ("BMW".equalsIgnoreCase(carName)) {
return new BMWCar();
}else if("Mercedes".equalsIgnoreCase(carName)){
return new MercedesCar();
}else {
throw new IllegalArgumentException("无法找到这"+carName+"类car。");
}
}
}
测试及其结果:
public class Test {
public static void main(String[] args) {
BaseCar bmw = new CarFactory().getCar("BMW");
bmw.driving();
BaseCar mercedes = new CarFactory().getCar("Mercedes");
mercedes.driving();
//无法找到这glj类car。
BaseCar glj = new CarFactory().getCar("glj");
mercedes.driving();
}
}
---------------
BMW开车……
Mercedes开车……
Exception in thread "main" java.lang.IllegalArgumentException: 无法找到这glj类car。
at com.glj.factory.CarFactory.getCar(CarFactory.java:22)
at com.glj.factory.Test.main(Test.java:18)
汽车简单工厂类-switch:
总感觉每次if都不怎么优雅好看,换个switch看看效果...
public class CarFactory {
/**
*
* @param carName 汽车品牌名称
* @return 汽车品牌类型
*/
public BaseCar getCar(String carName){
switch (carName){
case "BMW":
return new BMWCar();
case "Mercedes":
return new MercedesCar();
default:
throw new IllegalArgumentException("无法找到这"+carName+"类car。");
}
}
}
汽车简单工厂类-反射:
public class CarFactory {
/**
*
* @param carName 汽车品牌名称
* @return 汽车品牌类型
*/
public BaseCar getCar(String carName){
BaseCar baseCar = null;
try {
baseCar = (BaseCar) Class.forName(carName).newInstance();
} catch (InstantiationException e) {
throw new IllegalArgumentException("无法找到这"+carName+"类car。");
} catch (IllegalAccessException e) {
throw new IllegalArgumentException("无法找到这"+carName+"类car。");
} catch (ClassNotFoundException e) {
throw new IllegalArgumentException("无法找到这"+carName+"类car。");
}
return baseCar;
}
}
测试结果:
public class Test {
public static void main(String[] args) {
BaseCar bmw = new CarFactory().getCar("com.glj.factory.BMWCar");
bmw.driving();
BaseCar mercedes = new CarFactory().getCar("com.glj.factory.MercedesCar");
mercedes.driving();
//无法找到这glj类car。
BaseCar glj = new CarFactory().getCar("glj");
mercedes.driving();
}
}
///
BMW开车……
Mercedes开车……
Exception in thread "main" java.lang.IllegalArgumentException: 无法找到这glj类car。
at com.glj.factory.CarFactory.getCar(CarFactory.java:25)
at com.glj.factory.Test.main(Test.java:19)