设计模式-简单工厂 – 记忆角落

设计模式-简单工厂

/ 0评 / 0

简单工厂模式,虽然不在23种设计模式中。但是可以认为是工厂模式的一种特殊实现,并且在日常中使用广泛,所以还是值得我们去学习的。

解释

优点:

  1. 一个调用者想创建一个对象,只要知道其名称就可以了
  2. 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。 3、屏蔽产品的具体实现,调用者只关心产品的接口

缺点:

工厂类的职责相对过重,增加新的产品需要修改工厂类的判断逻辑,违背开闭原则,如果产品数量过多,维护将变得非常困难。

列子实现:

模拟场景:

现在汽车品牌千千万...我才不知你要那辆...

UML图:

image-20211025174005561

基础的汽车类:

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)

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注