抽象工厂模式
定义
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
使用场景
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
案例
画红黄蓝三种颜色的圆、长方形
package factory;
public abstract class AbstractFactory {
public abstract Color getColor(String color);
public abstract Shape getShape(String shape);
}
package factory;
public class ColorFactory extends AbstractFactory {
@Override
public Color getColor(String color) {
if (color == null) {
return null;
}
if (color.equalsIgnoreCase("RED")) {
return new Red();
} else if (color.equalsIgnoreCase("YELLOW")) {
return new Yellow();
} else if (color.equalsIgnoreCase("BLUE")) {
return new Blue();
}
return null;
}
@Override
public Shape getShape(String shape) {
return null;
}
}
package factory;
public class ShapeFactory extends AbstractFactory{
@Override
public Color getColor(String color) {
return null;
}
@Override
public Shape getShape(String shape) {
if (shape == null) {
return null;
}
if (shape.equalsIgnoreCase("CIRCLE")) {
return new Circle();
} else if (shape.equalsIgnoreCase("RECTANGLE")) {
return new Rectangle();
}
return null;
}
}
package factory;
public interface Color {
void fill();
}
package factory;
public class Blue implements Color {
@Override
public void fill() {
System.out.println("蓝色");
}
}
package factory;
public class Red implements Color {
@Override
public void fill() {
System.out.println("红色");
}
}
package factory;
public class Yellow implements Color {
@Override
public void fill() {
System.out.println("黄色");
}
}
package factory;
public interface Shape {
void draw();
}
package factory;
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("圆形");
}
}
package factory;
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("长方形");
}
}
package factory;
public class Test {
public static void main(String[] args) {
AbstractFactory shapeFactory = FactoryProducer.getFactory("SHAPE");
Shape shape = shapeFactory.getShape("CIRCLE");
shape.draw();
AbstractFactory colorFactory = FactoryProducer.getFactory("COLOR");
Color color = colorFactory.getColor("RED");
color.fill();
}
}