小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();
}
}