抽象工厂模式 (Abstract Factory Pattern) 是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定类。每个生成的工厂都能按照工厂模式提供对象。
优点:当一个产品族中的多个对象被设计成一起工作时,能保证客户端始终只使用同一个产品族中的对象。
缺点:产品族扩展非常困难。
使用场景:生成不同操作系统的程序。
实现
创建 Shape 和 Color 接口与实现接口的实体类,创建抽象工厂类 AbstractFactory,定义工厂类 ShapeFactory 与 ColorFactory,创建工厂生成器类 FactoryProducer。
测试类 AbstractFactoryPatternTest 使用 FactoryProducer 来获取 AbstractFactory 对象,向 AbstractFactory 传递形状信息 Shape (CIRCLE / RECTANGLE / SQUARE),以获取所需对象,同时向 AbstractFactory 传递颜色信息 Color (RED / GREEN / BLUE),以获取所需对象。
1 创建形状接口
public interface Shape {
void draw();
}
2 创建实现形状接口的实体类
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Draw a rectangle.");
}
}
public class Square implements Shape {
@Override
public void draw() {
System.out.println("Draw a square.");
}
}
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Draw a circle.");
}
}
3 创建颜色接口
public interface Color {
void fill();
}
4 创建实现颜色接口的实体类
public class Red implements Color {
@Override
public void fill() {
System.out.println("Fill red.");
}
}
public class Green implements Color {
@Override
public void fill() {
System.out.println("Fill green.");
}
}
public class Blue implements Color {
@Override
public void fill() {
System.out.println("Fill blue.");
}
}
5 创建抽象工厂类
public abstract class AbstractFactory {
public abstract Shape getShape(String shape);
public abstract Color getColor(String color);
}
6 创建继承于抽象工厂类的工厂类
public class ShapeFactory extends AbstractFactory {
@Override
public Shape getShape(String shape) {
if (shape == null) {
return null;
} else if (shape.equalsIgnoreCase("CIRCLE")) {
return new Circle();
} else if (shape.equalsIgnoreCase("RECTANGLE")) {
return new Rectangle();
} else if (shape.equalsIgnoreCase("SQUARE")) {
return new Square();
}
return null;
}
@Override
public Color getColor(String color) {
return null;
}
}
public class ColorFactory extends AbstractFactory {
@Override
public Shape getShape(String shape) {
return null;
}
@Override
public Color getColor(String color) {
if (color == null) {
return null;
} else if (color.equalsIgnoreCase("RED")) {
return new Red();
} else if (color.equalsIgnoreCase("GREEN")) {
return new Green();
} else if (color.equalsIgnoreCase("BLUE")) {
return new Blue();
}
return null;
}
}
7 创建工厂生成器类
public class FactoryProducer {
public static AbstractFactory getFactory(String choice) {
if (choice.equalsIgnoreCase("SHAPE")) {
return new ShapeFactory();
} else if (choice.equalsIgnoreCase("COLOR")) {
return new ColorFactory();
}
return null;
}
}
8 通过 FactoryProducer 获取 AbstractFactory,传递类型信息获取实体类对象
public class AbstractFactoryTest {
public static void main(String[] args) {
// 获取形状工厂
AbstractFactory shapeFactory = FactoryProducer.getFactory("SHAPE");
// 获取形状为 Circle 的对象
Shape circle = shapeFactory.getShape("CIRCLE");
// 调用 Circle 的 draw 方法
circle.draw();
// 获取形状为 Rectangle 的对象
Shape rectangle = shapeFactory.getShape("RECTANGLE");
// 调用 Rectangle 的 draw 方法
rectangle.draw();
// 获取形状为 Square 的对象
Shape square = shapeFactory.getShape("SQUARE");
// 调用 Square 的 draw 方法
square.draw();
// 获取颜色工厂
AbstractFactory colorFactory = FactoryProducer.getFactory("COLOR");
// 获取颜色为 Red 的对象
Color red = colorFactory.getColor("RED");
// 调用 Red 的 fill 方法
red.fill();
// 获取颜色为 Green 的对象
Color green = colorFactory.getColor("Green");
// 调用 Green 的 fill 方法
green.fill();
// 获取颜色为 Blue 的对象
Color blue = colorFactory.getColor("BLUE");
// 调用 Blue 的 fill 方法
blue.fill();
}
}
执行结果
Draw a circle.
Draw a rectangle.
Draw a square.
Fill red.
Fill green.
Fill blue.
网友评论