抽象工厂模式(Abstract Factory Pattern)在Java中是一种非常有用的设计模式,用于创建一系列相关或相互依赖的对象,而无需指定它们具体的类。这个模式提供了一种创建对象的最佳方式,它封装了创建对象的细节,并允许客户依赖于抽象类型而不是具体类型。
以下是一个简单的Java案例,展示了抽象工厂模式的应用。在这个例子中,我们将创建两个产品族:一种用于制作文本编辑器的组件(如按钮和文本框),另一种用于制作图形编辑器的组件(如圆形和矩形)。
首先,我们定义两个抽象产品接口(Button
和 Shape
)以及它们的具体实现。
java复制代码
// 抽象产品:按钮
interface Button {
void paint();
}
// 文本编辑器的按钮
class TextButton implements Button {
@Override
public void paint() {
System.out.println("Text Button painted.");
}
}
// 图形编辑器的按钮
class GraphicalButton implements Button {
@Override
public void paint() {
System.out.println("Graphical Button painted.");
}
}
// 抽象产品:形状
interface Shape {
void draw();
}
// 文本编辑器的形状(这里仅为示例,实际上文本编辑器可能不需要形状)
class TextShape implements Shape {
@Override
public void draw() {
// 文本编辑器通常不处理形状,这里仅为演示
System.out.println("Text Shape drawn (dummy).");
}
}
// 图形编辑器的圆形
class Circle implements Shape {
@Override
public void draw() {
System.out.println("Circle drawn.");
}
}
// 图形编辑器的矩形
class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Rectangle drawn.");
}
}
接下来,我们定义抽象工厂接口及其具体实现。
java复制代码
// 抽象工厂
interface Factory {
Button createButton();
Shape createShape();
}
// 文本编辑器工厂
class TextEditorFactory implements Factory {
@Override
public Button createButton() {
return new TextButton();
}
@Override
public Shape createShape() {
return new TextShape(); // 文本编辑器可能不需要形状,这里仅为示例
}
}
// 图形编辑器工厂
class GraphicalEditorFactory implements Factory {
@Override
public Button createButton() {
return new GraphicalButton();
}
@Override
public Shape createShape() {
return new Circle(); // 这里返回Circle作为示例,也可以返回Rectangle等
}
}
最后,我们通过一个客户端类来演示如何使用这些工厂和产品。
java复制代码
public class Client {
public static void main(String[] args) {
// 使用文本编辑器工厂
Factory textFactory = new TextEditorFactory();
Button textButton = textFactory.createButton();
Shape textShape = textFactory.createShape();
textButton.paint();
textShape.draw(); // 尽管这里只是打印了一个假信息
// 使用图形编辑器工厂
Factory graphFactory = new GraphicalEditorFactory();
Button graphButton = graphFactory.createButton();
Shape graphShape = graphFactory.createShape();
graphButton.paint();
graphShape.draw();
}
}
在这个例子中,TextEditorFactory
和 GraphicalEditorFactory
是具体工厂类,它们分别负责创建特定产品族(文本编辑器和图形编辑器)的对象。客户端代码通过调用工厂的方法来获取产品对象,而无需知道这些对象是如何被创建的。这样,我们就实现了产品对象的创建与使用的分离,提高了系统的灵活性和可扩展性。