慢慢说设计模式:抽象工厂

387 阅读2分钟

小Q:什么是设计模式

慢慢:设计模式是系统服务设计中针对常见场景的一种解决方案,可以解决功能逻辑开发中遇到的共性问题。设计模式并不局限最终的实现方案,而是在这种概念模式下,解决系统设计中的代码逻辑问题。

小Q:什么是抽象工厂

慢慢:工厂模式是创建物品的工厂,而抽象工厂则是创建工厂的工厂。这种设计模式也属于创建型模式。例如五菱公司,既有生产汽车的工厂,也有生产口罩的工厂。

也就是说,在工厂的基础上,当有很多个工厂时,创建一个上一级的工厂来对其进行管理。

小Q:快点上代码把!

慢慢:好的。还是根据以前工厂的模式创建出工厂和物品。

// 颜色父接口
public interface Color {
    void fill();
}
// 颜色:蓝色
public class Blue implements Color {
    public void fill() {
        System.out.println("blue");
    }
}
// 颜色:红色
public class Red implements Color {
    public void fill() {
        System.out.println("red");
    }
}
// 颜色工厂
public class ColorFactory {
    public Color getColor(Class<? extends Color> colorClass) throws IllegalAccessException, InstantiationException {
        return colorClass.newInstance();
    }
}

以上就完成工厂模式的基本创建,我们再创建另一个工厂模式

// 形状父接口
public interface Shape {
    void showShap();
}
// 形状:矩形
public class Rectangle implements Shape {
    public void showShap() {
        System.out.println("rectangle");
    }
}
// 形状:正方形
public class Square implements Shape {
    public void showShap() {
        System.out.println("square");
    }
}
// 形状工厂
public class ShapeFactory {
    public Shape getShape(Class<? extends Shape> shapeClass) throws IllegalAccessException, InstantiationException {
        return shapeClass.newInstance();
    }
}

上述就是两个工厂模式的创建过程。接下来我们再创建一个抽象工厂对这两个工厂进行管理。

public class AbstractFactory {
    final ColorFactory colorFactory;  // 简单的单例模式,不会重复生产
    final ShapeFactory shapeFactory;
    public AbstractFactory() {
        colorFactory = new ColorFactory();
        shapeFactory = new ShapeFactory();
    }
  
    public ColorFactory getColorFactory() {
        return colorFactory;
    }
    public ShapeFactory getShapgeFactory() {
        return shapeFactory;
    }
}

测试:

public class AbstractFactoryTest {
    public static void main(String[] args) throws InstantiationException, IllegalAccessException {
        AbstractFactory factory = new AbstractFactory();  // 获取抽象工厂
        ColorFactory colorFactory = factory.getColorFactory();  // 从抽象工厂中得到颜色工厂
        ShapeFactory shapeFactory = factory.getShapgeFactory();  // 从抽象工厂中得到形状工厂
        Color color = colorFactory.getColor(Blue.class);   // 从颜色工厂中获取颜色
        Shape shape = shapeFactory.getShape(Rectangle.class);  // 从形状工厂中获取形状
        color.fill();
        shape.showShap();
    }
}