首先,简单工厂模式内部的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();
- }
- }
在之前只需要生产汽车的时候,工厂方法模式就很好的解决了问题,
之后增加了需求,也需要轮船了,那么此时工厂既能生产汽车,也能生产轮船
就升级为抽象工厂模式,解决了不同族类型的问题
汽车是一个族,轮船是一个族,汽车和轮船不是同一个族
工厂方法解决了同族商品不同型号的问题
抽象工厂解决了不同族商品不同型号的问题
原文链接:http://www.cnblogs.com/randy123/p/15682133.html