Java 工厂类示例解析
简介
在 Java 编程中,工厂类(Factory Class)是一种创建对象的设计模式。它提供了一种将对象创建和使用分离的方式,使得代码的依赖关系更加清晰,易于维护和扩展。通过工厂类,我们可以将对象创建的逻辑封装在一个单独的类中,而不是在多个地方重复编写创建对象的代码。这篇博客将深入探讨工厂类在 Java 中的基础概念、使用方法、常见实践以及最佳实践。
目录
- 基础概念
- 使用方法
- 简单工厂模式
- 工厂方法模式
- 抽象工厂模式
- 常见实践
- 创建对象的复杂逻辑封装
- 依赖注入
- 最佳实践
- 单一职责原则
- 可维护性和扩展性
- 代码示例
- 简单工厂模式示例
- 工厂方法模式示例
- 抽象工厂模式示例
- 小结
- 参考资料
基础概念
工厂类是一个专门负责创建对象的类。它提供了一个或多个方法,这些方法根据不同的条件或参数来创建不同类型的对象。工厂类的核心思想是将对象的创建过程封装起来,使得调用者不需要了解对象创建的具体细节,只需要关心如何获取到所需的对象。
工厂类模式主要有三种类型: - 简单工厂模式(Simple Factory Pattern):简单工厂模式是工厂模式的基础,它定义了一个工厂类,该类有一个创建产品对象的方法,根据传入的参数决定创建哪种具体产品对象。简单工厂模式不属于 GoF 设计模式,但它是工厂方法模式和抽象工厂模式的基础。 - 工厂方法模式(Factory Method Pattern):在工厂方法模式中,工厂类不再负责创建所有产品对象,而是将创建对象的方法抽象成抽象方法,由具体的工厂子类来实现。这样,每个具体工厂子类负责创建一种特定类型的产品对象。 - 抽象工厂模式(Abstract Factory Pattern):抽象工厂模式中,工厂类创建一系列相关的产品对象。工厂类是抽象的,具体的创建逻辑由具体的工厂子类实现。每个具体工厂子类负责创建一组相关的产品对象。
使用方法
简单工厂模式
简单工厂模式的结构通常包含以下几个部分: - 产品接口(Product Interface):定义产品的通用方法。 - 具体产品类(Concrete Product Classes):实现产品接口,提供具体的功能。 - 工厂类(Factory Class):包含一个创建产品对象的静态方法,根据传入的参数决定创建哪种具体产品对象。
工厂方法模式
工厂方法模式在简单工厂模式的基础上进行了扩展,其结构包含: - 产品接口(Product Interface):与简单工厂模式相同,定义产品的通用方法。 - 具体产品类(Concrete Product Classes):实现产品接口。 - 抽象工厂类(Abstract Factory Class):定义一个抽象的创建产品对象的方法。 - 具体工厂类(Concrete Factory Classes):继承抽象工厂类,实现创建产品对象的方法。
抽象工厂模式
抽象工厂模式的结构更为复杂,包含以下部分: - 产品接口(Product Interfaces):定义不同类型产品的通用方法。 - 具体产品类(Concrete Product Classes):实现相应的产品接口。 - 抽象工厂类(Abstract Factory Class):定义一组创建不同类型产品对象的抽象方法。 - 具体工厂类(Concrete Factory Classes):继承抽象工厂类,实现创建不同类型产品对象的方法。
常见实践
创建对象的复杂逻辑封装
当创建对象的过程涉及到复杂的初始化逻辑、资源获取或配置时,可以将这些逻辑封装在工厂类中。这样,在其他地方使用对象时,只需要调用工厂类的方法,而不需要关心复杂的创建过程。
依赖注入
在依赖注入(Dependency Injection)中,工厂类可以用来创建需要注入的对象。通过工厂类,我们可以更灵活地控制对象的创建过程,并且可以在不同的环境中使用不同的对象创建逻辑。
最佳实践
单一职责原则
工厂类应该遵循单一职责原则,即一个工厂类只负责创建一种或一组相关的对象。这样可以使得工厂类的职责清晰,易于维护和扩展。
可维护性和扩展性
在设计工厂类时,要考虑到代码的可维护性和扩展性。尽量使用接口和抽象类来定义产品和工厂,以便在需要添加新的产品或工厂时,不需要对现有代码进行大量修改。
代码示例
简单工厂模式示例
// 产品接口
interface Shape {
void draw();
}
// 具体产品类:圆形
class Circle implements Shape {
@Override
public void draw() {
System.out.println("Drawing a circle.");
}
}
// 具体产品类:矩形
class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Drawing a rectangle.");
}
}
// 工厂类
class ShapeFactory {
public static Shape createShape(String shapeType) {
if ("circle".equalsIgnoreCase(shapeType)) {
return new Circle();
} else if ("rectangle".equalsIgnoreCase(shapeType)) {
return new Rectangle();
}
return null;
}
}
// 测试代码
public class SimpleFactoryExample {
public static void main(String[] args) {
Shape circle = ShapeFactory.createShape("circle");
circle.draw();
Shape rectangle = ShapeFactory.createShape("rectangle");
rectangle.draw();
}
}
工厂方法模式示例
// 产品接口
interface Shape {
void draw();
}
// 具体产品类:圆形
class Circle implements Shape {
@Override
public void draw() {
System.out.println("Drawing a circle.");
}
}
// 具体产品类:矩形
class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Drawing a rectangle.");
}
}
// 抽象工厂类
abstract class ShapeFactory {
public abstract Shape createShape();
}
// 具体工厂类:圆形工厂
class CircleFactory extends ShapeFactory {
@Override
public Shape createShape() {
return new Circle();
}
}
// 具体工厂类:矩形工厂
class RectangleFactory extends ShapeFactory {
@Override
public Shape createShape() {
return new Rectangle();
}
}
// 测试代码
public class FactoryMethodExample {
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();
}
}
抽象工厂模式示例
// 产品接口 1:形状
interface Shape {
void draw();
}
// 具体产品类:圆形
class Circle implements Shape {
@Override
public void draw() {
System.out.println("Drawing a circle.");
}
}
// 具体产品类:矩形
class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Drawing a rectangle.");
}
}
// 产品接口 2:颜色
interface Color {
void fill();
}
// 具体产品类:红色
class Red implements Color {
@Override
public void fill() {
System.out.println("Filling with red.");
}
}
// 具体产品类:蓝色
class Blue implements Color {
@Override
public void fill() {
System.out.println("Filling with blue.");
}
}
// 抽象工厂类
abstract class AbstractFactory {
public abstract Shape createShape();
public abstract Color createColor();
}
// 具体工厂类:圆形红色工厂
class CircleRedFactory extends AbstractFactory {
@Override
public Shape createShape() {
return new Circle();
}
@Override
public Color createColor() {
return new Red();
}
}
// 具体工厂类:矩形蓝色工厂
class RectangleBlueFactory extends AbstractFactory {
@Override
public Shape createShape() {
return new Rectangle();
}
@Override
public Color createColor() {
return new Blue();
}
}
// 测试代码
public class AbstractFactoryExample {
public static void main(String[] args) {
AbstractFactory circleRedFactory = new CircleRedFactory();
Shape circle = circleRedFactory.createShape();
circle.draw();
Color red = circleRedFactory.createColor();
red.fill();
AbstractFactory rectangleBlueFactory = new RectangleBlueFactory();
Shape rectangle = rectangleBlueFactory.createShape();
rectangle.draw();
Color blue = rectangleBlueFactory.createColor();
blue.fill();
}
}
小结
工厂类在 Java 编程中是一种非常有用的设计模式,它通过将对象创建和使用分离,提高了代码的可维护性和可扩展性。不同类型的工厂模式(简单工厂模式、工厂方法模式和抽象工厂模式)适用于不同的场景,开发者可以根据具体需求选择合适的模式。遵循最佳实践,如单一职责原则,可以使工厂类的设计更加合理和高效。
参考资料
- 《Effective Java》 by Joshua Bloch
- 《Design Patterns - Elements of Reusable Object-Oriented Software》 by Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides
- Oracle Java Documentation