大话设计模式——7.抽象工厂模式(Abstract Factory Pattern)

1.介绍

抽象工厂模式是工厂模式的进一步优化,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。属于创建型模式。
UML图:
在这里插入图片描述

2.示例

车辆制造工厂,不仅可以制造轿车也可以用来生产自行车。
1)AbstractFactory:VehicleFactory

public interface VehicleFactory {

    /**
     * 建造自行车
     *
     * @return
     */
    Bike createBike();

    /**
     * 建造轿车
     *
     * @return
     */
    Car createCar();
}

2)AbstractProductA:Bike

public interface Bike {

    void bikeName();
}

3)AbstractProductB:Car

public interface Car {

    void carName();
}

4)ConcreteFactoryA:BMWVehicleFactory

public class BMWVehicleFactory implements VehicleFactory {

    @Override
    public Bike createBike() {
        return new BMWBike();
    }

    @Override
    public Car createCar() {
        return new BMWCar();
    }
}

5)ConcreteFactoryB:TeslaVehicleFactory

public class TeslaVehicleFactory implements VehicleFactory {

    @Override
    public Bike createBike() {
        return new TeslaBike();
    }

    @Override
    public Car createCar() {
        return new TeslaCar();
    }
}

6)ConcreteProductA1:BMWCar

public class BMWCar implements Car{

    @Override
    public void carName() {
        System.out.println("宝马 x5 四驱 燃油车");
    }
}

7)ConcreteProductA2:TeslaCar

public class TeslaCar implements Car {

    @Override
    public void carName() {
        System.out.println("特斯拉 modelY 四驱 电动车");
    }
}

8)ConcreteProductB1:BMWBike

public class BMWBike implements Bike{

    @Override
    public void bikeName() {
        System.out.println("宝马 碳纤维 大喇叭 二驱 自行车");
    }
}

9)ConcreteProductB2:TeslaCar

public class TeslaCar implements Car {

    @Override
    public void carName() {
        System.out.println("特斯拉 modelY 四驱 电动车");
    }
}

10)运行:
结合建议工厂模式:工厂生产者,可以再进行优化,通过反射的机制动态构建

public class VehicleFactoryProducer {


    /**
     * 超级工厂
     *
     * @param vehicleName
     * @return
     */
    public static VehicleFactory creatVehicleFactory(String vehicleName) {
        if ("BMW".equals(vehicleName)) {
            return new BMWVehicleFactory();
        } else if ("Tesla".equals(vehicleName)) {
            return new TeslaVehicleFactory();
        }

        return null;
    }
}

运行类

public class Main {

    public static void main(String[] args) {

        System.out.println("------BMW制造工厂-----");
        VehicleFactory bmwFactory = VehicleFactoryProducer.creatVehicleFactory("BMW");
        bmwFactory.createBike().bikeName();
        bmwFactory.createCar().carName();

        System.out.println("\n------Tesla制造工厂-----");
        VehicleFactory teslaFactory = VehicleFactoryProducer.creatVehicleFactory("Tesla");
        teslaFactory.createCar().carName();
        teslaFactory.createBike().bikeName();
    }
}

在这里插入图片描述

3.总结

1)优点:
a. 让具体的创建实例过程与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂实现分离,不会出现在客户代码中
b. 可以保证使用方始终只使用同一个产品族中的对象
c. 扩展容易,只需要增加新的产品类和对应的工厂类即可

2)缺点:
a. 不符合开闭原则,新增产品类时需要修改抽象工厂和抽象产品中的代码
b. 增加了系统的复杂性和抽象性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值