设计模式-抽象工厂模式 – 记忆角落

设计模式-抽象工厂模式

/ 0评 / 0

解释

抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

优点:

当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。

缺点:

产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。

列子实现:

模拟场景:

现在汽车品牌千千万...我才不知你要那辆...更不知你喜欢什么颜色的车辆...

UML图:

image-20211026174236785

基础的汽车类:

public interface  BaseCar {
    /**
     * 开车...
     */
    void driving();
}

宝马:

public class BMWCar implements BaseCar{

    @Override
    public void driving() {
        System.out.println("BMW开车……");
    }
}

奔驰:

public class MercedesCar implements BaseCar{

    @Override
    public void driving() {
        System.out.println("Mercedes开车……");
    }
}

基础的颜色类:

public interface BaseColor {
    /**
     * 填上您爱车的颜色...
     */
    void fillColor();
}

red:

public class Red implements BaseColor{

    @Override
    public void fillColor() {
        System.out.println("red....");
    }
}

blue:

public class Blue implements BaseColor{

    @Override
    public void fillColor() {
        System.out.println("blue....");
    }
}

为 Color 和 Car 对象创建抽象类来获取工厂。

public abstract class AbstractFactory {
    /**
     * 获取对应颜色
     * @param colorName
     * @return
     */
    public abstract BaseColor getColor(String colorName);

    /**
     * 获取对应汽车
     * @param carName
     * @return
     */
    public abstract BaseCar getCar(String carName);

}

创建扩展了 AbstractFactory 的工厂类,基于抽象方法生成实体类的对象。

public class CarFactory extends AbstractFactory{

    @Override
    public BaseColor getColor(String colorName) {
        return null;
    }

    /**
     *
     * @param carName 汽车品牌名称
     * @return 汽车品牌类型
     */
    @Override
    public BaseCar getCar(String carName){
        BaseCar baseCar = null;
        try {
            baseCar = (BaseCar) Class.forName(carName).newInstance();
        } catch (InstantiationException e) {
            throw new IllegalArgumentException("无法找到这"+carName+"类car。");
        } catch (IllegalAccessException e) {
            throw new IllegalArgumentException("无法找到这"+carName+"类car。");
        } catch (ClassNotFoundException e) {
            throw new IllegalArgumentException("无法找到这"+carName+"类car。");
        }
        return baseCar;
    }

}


public class ColorFactory extends AbstractFactory{

    @Override
    public BaseColor getColor(String colorName) {
        BaseColor baseColor = null;
        try {
            baseColor = (BaseColor) Class.forName(colorName).newInstance();
        } catch (InstantiationException e) {
            throw new IllegalArgumentException("无法找到这"+colorName+"颜色呢。");
        } catch (IllegalAccessException e) {
            throw new IllegalArgumentException("无法找到这"+colorName+"颜色呢。");
        } catch (ClassNotFoundException e) {
            throw new IllegalArgumentException("无法找到这"+colorName+"颜色呢。");
        }
        return baseColor;
    }

    @Override
    public BaseCar getCar(String carName) {
        return null;
    }
}

创建一个生成器类,通过传递标志来获取对应工厂。

public class FactoryProducer {

    public static AbstractFactory getFactory(String choice){
        switch (choice){
            case "car":
                return new CarFactory();
            case "color":
                return new ColorFactory();
            default:
                throw new IllegalArgumentException("无法找到这"+choice+"的产品..");
        }
    }

}

测试及其结果:

public class Test {
    public static void main(String[] args) {

        // 获取汽车工厂
        AbstractFactory carFactory = FactoryProducer.getFactory("car");
        // 获取对应品牌对象
        BaseCar bmw = carFactory.getCar("com.glj.factory.BMWCar");
        bmw.driving();

        BaseCar mercedes = carFactory.getCar("com.glj.factory.MercedesCar");
        mercedes.driving();

        // 获取颜色工厂
        AbstractFactory colorFactory = FactoryProducer.getFactory("color");
        // 获取对应颜色对象
        BaseColor redColor = colorFactory.getColor("com.glj.factory.Red");
        redColor.fillColor();

        BaseColor blueColor = colorFactory.getColor("com.glj.factory.Blue");
        blueColor.fillColor();

    }
}


------
BMW开车……
Mercedes开车……
red....
blue....

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注