设计模式:工厂模式(Factory Pattern)
一、概述
在软件开发中,设计模式是经过反复实践总结出的最佳方案,旨在解决特定类型的问题。其中,**工厂模式(Factory Pattern)**是创建型设计模式之一,它的主要目的是通过定义一个接口来创建对象,而由子类来决定实例化哪个具体的类。工厂模式的核心思想是将对象的创建过程与使用过程解耦,增强系统的灵活性和可扩展性。
在本文中,我们将详细探讨工厂模式的基础概念、实现方式,并展示在实际业务中的应用场景,最后分析Spring框架中如何实现工厂模式来解耦对象创建。
二、工厂模式的结构
工厂模式通常由以下几个核心部分组成:
- 产品接口(Product):定义了工厂方法所创建的对象的接口。
- 具体产品类(ConcreteProduct):实现了产品接口的具体类。
- 工厂接口(Creator):定义了创建产品对象的工厂方法。
- 具体工厂类(ConcreteCreator):实现工厂方法,并返回具体产品的实例。
工厂模式有几种变体,包括简单工厂模式、工厂方法模式和抽象工厂模式。本文主要讨论工厂方法模式,并通过一个具体示例来展示其应用。
三、工厂模式的示例
1. 用例描述
假设我们在开发一个图形绘制工具,用户可以选择绘制不同形状的图形(例如:圆形、矩形等)。我们希望将对象的创建与使用解耦,从而避免直接依赖具体的类。
2. 类图
工厂模式的类图如下:
类图解释:
Shape
是一个接口,定义了所有图形类(如Circle
和Rectangle
)应当实现的draw()
方法。Circle
和Rectangle
是具体的产品类,实现了Shape
接口。ShapeFactory
是工厂接口,定义了一个createShape()
方法,用于创建图形对象。CircleFactory
和RectangleFactory
是具体的工厂类,负责创建Circle
和Rectangle
对象。
3. Java代码实现
以下是工厂模式的具体实现:
1. 产品接口 Shape
public interface Shape {void draw();
}
2. 具体产品类 Circle
和 Rectangle
// 圆形类
public class Circle implements Shape {@Overridepublic void draw() {System.out.println("Drawing a Circle");}
}// 矩形类
public class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("Drawing a Rectangle");}
}
3. 工厂接口 ShapeFactory
public interface ShapeFactory {Shape createShape();
}
4. 具体工厂类 CircleFactory
和 RectangleFactory
// 圆形工厂
public class CircleFactory implements ShapeFactory {@Overridepublic Shape createShape() {return new Circle();}
}// 矩形工厂
public class RectangleFactory implements ShapeFactory {@Overridepublic Shape createShape() {return new Rectangle();}
}
5. 客户端代码(使用工厂创建对象)
public class Client {public static void main(String[] args) {ShapeFactory circleFactory = new CircleFactory();Shape circle = circleFactory.createShape();circle.draw(); // 输出: Drawing a CircleShapeFactory rectangleFactory = new RectangleFactory();Shape rectangle = rectangleFactory.createShape();rectangle.draw(); // 输出: Drawing a Rectangle}
}
4. 代码解析
- Shape接口:定义了所有形状类的通用方法
draw()
,用于绘制图形。 - Circle和Rectangle类:分别是具体的产品类,实现了
Shape
接口,提供各自的绘制方法。 - ShapeFactory接口:定义了一个工厂方法
createShape()
,用于创建具体的图形对象。 - CircleFactory和RectangleFactory类:分别是具体的工厂类,通过实现
ShapeFactory
接口来创建Circle
和Rectangle
对象。 - 客户端代码:客户端通过
ShapeFactory
接口来创建对应的图形对象,无需直接与具体类交互。
四、工厂模式的业务应用场景
1. 图形绘制工具中的形状创建
假设我们正在开发一个图形绘制工具,用户可以选择绘制不同的形状,比如圆形、矩形、三角形等。在这种情况下,工厂模式可以帮助我们将不同图形对象的创建与用户的选择解耦。
ShapeFactory shapeFactory = ShapeFactoryProvider.getFactory("circle");
Shape circle = shapeFactory.createShape();
circle.draw();
2. 数据库连接池的管理
在数据库连接池的管理中,工厂模式可以用来创建不同类型的数据库连接。例如,MySQL、PostgreSQL 和 SQLite 都需要不同的连接方式。通过工厂模式,我们可以为每种数据库创建一个工厂类来生成数据库连接。
3. 日志系统的创建
在一个大型应用中,可能需要根据配置来选择不同的日志记录方式(文件日志、数据库日志等)。工厂模式能够帮助我们根据日志类型的不同,创建不同的日志处理器实例。
LogFactory logFactory = LogFactoryProvider.getFactory("file");
LogWriter fileLogWriter = logFactory.createLogWriter();
fileLogWriter.writeLog("This is a log message");
4. 支付系统中的不同支付方式
在支付系统中,可能需要支持多种支付方式(如支付宝、微信支付、信用卡支付)。工厂模式通过工厂类帮助我们创建不同支付方式的支付对象,便于扩展和维护。
PaymentFactory paymentFactory = new PaymentFactory();
Payment payment = paymentFactory.getPayment("alipay");
payment.pay();
五、Spring框架中工厂模式的应用
Spring框架是一个大型的Java应用程序框架,它大量使用了工厂模式来解耦对象的创建与使用。以下是Spring源码中工厂模式的几个经典应用场景。
1. BeanFactory 和 ApplicationContext
Spring框架中,BeanFactory
和 ApplicationContext
充当了工厂的角色。它们通过工厂方法创建和管理容器中的Bean,解耦了对象的创建和使用。BeanFactory
是最基本的容器接口,定义了一个工厂方法 getBean()
来获取 Bean。
public interface BeanFactory {Object getBean(String name) throws BeansException;
}
ApplicationContext
是 BeanFactory
的子接口,提供更多高级功能,如事件传播、国际化支持等。
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
2. FactoryBean接口
FactoryBean
是Spring框架中用于创建复杂Bean的接口。开发者通过实现 FactoryBean
来定制Bean的创建过程,Spring会根据配置自动调用该接口创建Bean实例。
public interface FactoryBean<T> {T getObject() throws Exception;Class<?> getObjectType();boolean isSingleton();
}
3. Spring中的BeanDefinition
与工厂方法
在Spring容器中,BeanDefinition
用来描述每个Bean的配置信息,Spring通过工厂方法根据 BeanDefinition
来实例化Bean,进一步解耦了Bean的创建和使用。
六、总结
工厂模式是设计模式中非常重要的一种,它通过提供一个工厂接口来创建对象,从而解耦了对象的创建和使用。在实际业务中,工厂模式常常被用于处理复杂的对象创建过程,如图形绘制工具、支付系统、数据库连接池等。
在Spring框架中,工厂模式的应用非常广泛,Spring通过 BeanFactory
和 ApplicationContext
实现了容器的对象创建和管理,极大地提高了代码的灵活性