1

设计模式——工厂模式

 2 years ago
source link: https://segmentfault.com/a/1190000041080669
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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...


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK