在面向对象编程中,工厂模式和抽象工厂模式都是创建型设计模式,它们都致力于解决对象的创建问题,但各有侧重。本文将从概念、结构、应用场景到代码实现,完整解析这两种模式。
工厂模式定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
`java
// 抽象产品
interface Shape {
void draw();
}
// 具体产品
class Circle implements Shape {
@Override
public void draw() {
System.out.println("绘制圆形");
}
}
class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("绘制矩形");
}
}
// 抽象工厂
abstract class ShapeFactory {
public abstract Shape createShape();
// 可以添加其他公共方法
public void doSomething() {
Shape shape = createShape();
shape.draw();
}
}
// 具体工厂
class CircleFactory extends ShapeFactory {
@Override
public Shape createShape() {
return new Circle();
}
}
class RectangleFactory extends ShapeFactory {
@Override
public Shape createShape() {
return new Rectangle();
}
}
// 客户端使用
public class FactoryPatternDemo {
public static void main(String[] args) {
ShapeFactory circleFactory = new CircleFactory();
Shape circle = circleFactory.createShape();
circle.draw();
ShapeFactory rectangleFactory = new RectangleFactory();
Shape rectangle = rectangleFactory.createShape();
rectangle.draw();
}
}`
抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
`java
// 抽象产品族
interface Button {
void paint();
}
interface Checkbox {
void paint();
}
// 具体产品 - Windows风格
class WindowsButton implements Button {
@Override
public void paint() {
System.out.println("渲染Windows风格按钮");
}
}
class WindowsCheckbox implements Checkbox {
@Override
public void paint() {
System.out.println("渲染Windows风格复选框");
}
}
// 具体产品 - Mac风格
class MacButton implements Button {
@Override
public void paint() {
System.out.println("渲染Mac风格按钮");
}
}
class MacCheckbox implements Checkbox {
@Override
public void paint() {
System.out.println("渲染Mac风格复选框");
}
}
// 抽象工厂
interface GUIFactory {
Button createButton();
Checkbox createCheckbox();
}
// 具体工厂
class WindowsFactory implements GUIFactory {
@Override
public Button createButton() {
return new WindowsButton();
}
@Override
public Checkbox createCheckbox() {
return new WindowsCheckbox();
}
}
class MacFactory implements GUIFactory {
@Override
public Button createButton() {
return new MacButton();
}
@Override
public Checkbox createCheckbox() {
return new MacCheckbox();
}
}
// 客户端代码
public class AbstractFactoryDemo {
private GUIFactory factory;
private Button button;
private Checkbox checkbox;
public AbstractFactoryDemo(GUIFactory factory) {
this.factory = factory;
}
public void createUI() {
button = factory.createButton();
checkbox = factory.createCheckbox();
}
public void paint() {
button.paint();
checkbox.paint();
}
public static void main(String[] args) {
// 使用Windows风格
AbstractFactoryDemo windowsApp = new AbstractFactoryDemo(new WindowsFactory());
windowsApp.createUI();
windowsApp.paint();
System.out.println("---");
// 使用Mac风格
AbstractFactoryDemo macApp = new AbstractFactoryDemo(new MacFactory());
macApp.createUI();
macApp.paint();
}
}`
完整源码可访问GitHub仓库:[链接地址]
在实际开发中,工厂模式经常与配置文件、依赖注入框架结合使用,实现更加灵活的对象创建策略。Spring框架中的BeanFactory就是工厂模式的一个典型应用。
如若转载,请注明出处:http://www.w-share.com/product/265.html
更新时间:2025-11-29 15:32:45