1. 形象工厂模式概述

形象工厂就是工厂的工厂,把工厂形象成一个产品,那它的工厂就是形象工厂。

工厂模式用来生产产品,形象工厂用来生产工厂。

(1) 实用状况

同一个产品族(大类)外面,蕴含多种产品(小类),每个产品对应一个工厂,那么产品族就对应一个形象工厂。

(2) 长处

与工厂模式相似:屏蔽创立的具体细节、容易拓展产品

(3) 毛病

扩大产品族艰难,要减少一个新产品,须要改变的中央较多

2. 形象工厂模式实例

咱们接着工厂模式中的例子。
咱们当初曾经领有了建造汽车的工厂,然而咱们还想建造火车怎么办?
这里就能够应用形象工厂:

(1) 先申明一个火车接口

public interface Train {    void declare();}

(2) 创立各个品种的火车

public class HighSpeed implements Train {    @Override    public void declare() {        System.out.println("我是一辆高铁。");    }}public class LowSpeed implements Train {    @Override    public void declare() {        System.out.println("我是一辆快车。");    }}

(3) 申明形象工厂接口

public interface AbstractFactory {    // 用来生产汽车    Car buildCar(CAR_BRAND brand);    // 用来生产火车    Train buildTrain(TRAIN_TYPE type);}

(4) 创立工厂类,实现形象工厂接口

public class TrainFactory implements AbstractFactory {    @Override    public Car buildCar(CAR_BRAND brand) {        // 火车工厂不能生产汽车        return null;    }    @Override    public Train buildTrain(TRAIN_TYPE type) {        switch (type) {            case HIGH_SPEED:                return new HighSpeed();            case LOW_SPEED:                return new LowSpeed();            default:                return null;        }    }}enum TRAIN_TYPE {    HIGH_SPEED,    LOW_SPEED}

(5) 创立工厂生成类,用来创立工厂

public class FactoryProducer {    public static AbstractFactory getFactory(String choice) {        switch (choice) {            case "Car":                return new CarFactory();            case "Train":                return new TrainFactory();            default:                return null;        }    }}

(6) 应用形象工厂创立汽车和火车

public class FactoryDemo {    public static void main(String[] args) {        // 获取汽车工厂        AbstractFactory carFactory = FactoryProducer.getFactory("Car");        // 生产飞驰汽车        Car car = carFactory.buildCar(CAR_BRAND.BENZ);        car.declare();        // 获取火车工厂        AbstractFactory trainFactory = FactoryProducer.getFactory("Train");        // 生产高铁        Train train = trainFactory.buildTrain(TRAIN_TYPE.HIGH_SPEED);        train.declare();    }}

运行后果:

3. 一些思考

对于咱们的工厂来说,汽车和火车都是产品,而且都属于交通工具,所以它们都属于一个产品族。

咱们申明了AbstractFactory作为形象工厂接口,然而其实它并不是用来创立工厂的,它只是各个工厂的形象层。真正用来创立工厂的是FactoryProducer类,兴许它才更应该被叫做工厂的工厂。

AbstractFactory中申明了两个办法,别离用来生产汽车和火车,因而在它的实现类TrainFactory中,就得把两个接口都实现,即便它不应该生产汽车,这样不就毁坏了接口隔离准则了吗?
集体认为,能够在AbstractFactory中提供buildCar办法的默认实现,而后在TrainFactory中就不用实现这个它基本不关怀的办法了。

考虑一下,如果咱们要再生产一种产品,比方飞机,须要做出哪些改变?
飞机接口,飞机实现类,飞机工厂,形象工厂接口、工厂生成类。。。
如同是比间接应用工厂模式要麻烦一些,拓展产品组的确艰难了。
再思考下之前的问题,如果不在AbstractFactory中提供buildAirplain办法的默认实现,那么它所有的实现类(各个工厂)都须要进行改变,这也违反了开闭准则。

参考援用

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