1

1. 工厂模式概述

在工厂模式中,创建对象不会对外界暴露创建逻辑,而是通过使用一个共同的接口来获取新创建的对象。

在工厂模式中,不需要外界手动创建一个实例,而是通过调用对象工厂的方法,返回该类的实例。

比如我现在想获取一个产品,我只需要调用这个产品的工厂的方法就可以了。

(1) 适用情况

需要根据不同的条件,创建不同的实例对象时,可以考虑使用工厂模式。

(2) 优点

  1. 对于调用者来说,不必关心实例的创建方式,这样可以屏蔽产品的具体实现
  2. 拓展性高,如果需要增加一个产品,只需要拓展一个工厂类就可以

(3) 缺点

如果产品过多,则工厂类也会过多,增加了系统的复杂度。

2. 工厂模式实例

现在我们需要一个汽车工厂,用来创建不同品牌的汽车对象。

(1) 先声明一个汽车接口

public interface Car {
    void declare();
}

(2) 创建各个品牌汽车的实现类

public class Benz implements Car{
    @Override
    public void declare() {
        System.out.println("我是一辆奔驰。");
    }
}

public class BMW implements Car{
    @Override
    public void declare() {
        System.out.println("我是一辆宝马。");
    }
}

public class Audi implements Car{
    @Override
    public void declare() {
        System.out.println("我是一辆奥迪。");
    }
}

(3) 创建汽车工厂

public class CarFactory {
    /**
     * 生产汽车
     *
     * @param brand 汽车品牌
     * @return 汽车
     */
    public Car buildCar(CAR_BRAND brand) {
        switch (brand) {
            case BENZ:
                return new Benz();
            case BMW:
                return new BMW();
            case AUDI:
                return new Audi();
            default:
                return null;
        }
    }
}

enum CAR_BRAND {
    BENZ,
    BMW,
    AUDI
}

(4) 使用汽车工厂生产汽车

public class FactoryDemo {
    public static void main(String[] args) {
        CarFactory carFactory = new CarFactory();
        // 生产一辆奔驰
        Car benz = carFactory.buildCar(CAR_BRAND.BENZ);
        benz.declare();

        // 生产一辆宝马
        Car bmw = carFactory.buildCar(CAR_BRAND.BMW);
        bmw.declare();

        // 生产一辆奥迪
        Car audi = carFactory.buildCar(CAR_BRAND.AUDI);
        audi.declare();
    }
}

运行结果:
image.png

3. 一些思考

现在我们的工厂已经能生产三种品牌的汽车了,但是为了支持国产,我们还要生产比亚迪、小鹏等。
此时我们只需要创建它们对应的类,然后稍微调整下工厂就好了。

有人可能会说,看起来工厂模式和直接new感觉区别没那么大啊?

那是因为我们的工厂简化了生产过程而已,正常生产汽车时不得生产底盘、悬挂、车身、座椅等等等等,难道这些都要我们自己手动去实现吗。而有了工厂,我们就只需要一个方法就够了。

参考引用

工厂模式:https://www.runoob.com/design...


Zealf
13 声望1 粉丝