当前位置: 首页 > 产品大全 > Java设计模式详解 工厂模式与抽象工厂模式

Java设计模式详解 工厂模式与抽象工厂模式

Java设计模式详解 工厂模式与抽象工厂模式

在面向对象编程中,工厂模式和抽象工厂模式都是创建型设计模式,它们都致力于解决对象的创建问题,但各有侧重。本文将从概念、结构、应用场景到代码实现,完整解析这两种模式。

一、工厂模式(Factory Pattern)

1. 概念与定义

工厂模式定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

2. 核心组成

  • 抽象产品(Product):定义产品的接口
  • 具体产品(ConcreteProduct):实现抽象产品接口
  • 抽象工厂(Creator):声明工厂方法
  • 具体工厂(ConcreteCreator):实现工厂方法,返回具体产品实例

3. 代码实现

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

4. 应用场景

  • 无法预知需要创建的对象类型
  • 希望将对象的创建与使用分离
  • 需要为不同的客户端提供不同的产品实现

二、抽象工厂模式(Abstract Factory Pattern)

1. 概念与定义

抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

2. 核心组成

  • 抽象工厂(AbstractFactory):声明创建抽象产品的方法
  • 具体工厂(ConcreteFactory):实现创建具体产品的方法
  • 抽象产品(AbstractProduct):为产品声明接口
  • 具体产品(ConcreteProduct):定义具体工厂创建的对象

3. 代码实现

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

三、两种模式对比

1. 工厂模式特点

  • 单一产品等级结构
  • 一个具体工厂创建一种具体产品
  • 客户端需要知道具体工厂类

2. 抽象工厂模式特点

  • 多个产品等级结构
  • 一个具体工厂创建一个产品族
  • 客户端只需要知道抽象工厂

3. 适用场景对比

  • 工厂模式:产品种类单一,但创建过程复杂
  • 抽象工厂模式:需要创建产品族,保证产品之间的兼容性

四、源码链接与扩展

完整源码可访问GitHub仓库:[链接地址]

在实际开发中,工厂模式经常与配置文件、依赖注入框架结合使用,实现更加灵活的对象创建策略。Spring框架中的BeanFactory就是工厂模式的一个典型应用。

如若转载,请注明出处:http://www.w-share.com/product/265.html

更新时间:2025-11-29 15:32:45

产品大全

Top