设计模式-抽象工厂模式
抽象工厂可以在工厂方法模式上来理解
首先,简单工厂模式内部的if或者case语句是不满足开放-封闭原则的
所以对简单工厂模式进一步优化,出现了工厂方法模式。
工厂方法模式将工厂抽象,实例化出不同的工厂,使得满足了开放-封闭原则
抽象工厂是在工厂方法模式上的又一部增强
工厂方法模式解决了同一类型物品实例化的问题,而抽象工厂解决了不同类型物品实例化的问题
按照工厂方法卖车的例子来说 client在需要汽车时,根据需要的型号找到对应的工厂来获取汽车。
不同类型的汽车都属于汽车类型。
此时如果又需要轮船了怎么办?
这时抽象工厂就出现了,相当于每个工厂既能生产汽车,又能生成轮船
那么之前工厂方法模式的例子中的工厂抽象类就要增加生成轮船的方法
//定义工厂抽象类 abstract class Factory{ //能生产汽车 public abstract Car getCar(); //也能生产轮船 public abstract Car getShip(); }
增加轮船的抽象类
//定义轮船的抽象类 abstract class Ship{ public abstract void getType(); }
定义三种轮船
//定义三种轮船 class ShipA extends Ship{ @Override public void getType() { System.out.println("A型号轮船"); } } class ShipB extends Ship{ @Override public void getType() { System.out.println("B型号轮船"); } } class ShipC extends Ship{ @Override public void getType() { System.out.println("C型号轮船"); } }
三种工厂还要增加获取轮船的方法
//定义三种工厂 class FactoryA extends Factory{ @Override public Car getCar() { return new CarA(); } @Override public Car getShip() { return new ShipA(); } } class FactoryB extends Factory{ @Override public Car getCar() { return new CarB(); } @Override public Car getShip() { return new ShipB(); } } class FactoryC extends Factory{ @Override public Car getCar() { return new CarC(); } @Override public Car getShip() { return new ShipC(); } }
测试
public class AbstractFactoryTest { public static void main(String[] args) { //需要汽车 Factory factoryB = new FactoryB(); Car car = factoryB.getCar(); car.getType(); //需要轮船 Factory factoryC = new FactoryC(); Ship ship = factoryC.getShip(); ship.getType(); } }
在之前只需要生产汽车的时候,工厂方法模式就很好的解决了问题,
之后增加了需求,也需要轮船了,那么此时工厂既能生产汽车,也能生产轮船
就升级为抽象工厂模式,解决了不同族类型的问题
汽车是一个族,轮船是一个族,汽车和轮船不是同一个族
工厂方法解决了同族商品不同型号的问题
抽象工厂解决了不同族商品不同型号的问题