目录
一、什么是简单工厂模式
在软件开发的世界里,对象的创建就如同搭建积木,是一个极为常见的操作。在日常开发中,我们常常会使用new关键字来创建对象,这就好比直接拿起积木开始搭建。但是,随着项目规模的不断扩大,这种直接创建对象的方式逐渐暴露出一些问题。
想象一下,你正在开发一个大型的电商系统,其中涉及到各种不同类型的商品对象,如电子产品、服装、食品等。如果在代码的各个角落都直接使用new来创建这些商品对象,会导致代码的耦合性极高。一旦某个商品类的构造函数发生变化,或者需要更换创建商品对象的逻辑,就不得不四处查找并修改相关的代码,这无疑大大增加了维护的难度。此外,当有多个地方需要创建相同类型的商品对象时,重复的实例化逻辑会使代码变得冗余,就像在不同的地方反复搭建相同的积木结构,既浪费资源又难以管理。
简单工厂模式就应运而生了。它就像是一个经验丰富的建筑师,专门负责管理和创建对象。简单工厂模式定义了一个工厂类,这个工厂类就如同建筑师手中的设计蓝图,它可以根据传入的参数不同,返回不同类的实例。而这些被创建的实例,通常都具有共同的父类或实现相同的接口,就好比不同类型的积木都遵循相同的拼接规则。
简单工厂模式的核心,就在于这个工厂类。它集中了对象创建的逻辑,将对象的创建和使用分离开来。客户端在需要对象时,只需告诉工厂类自己的需求,即传入相应的参数,就可以获得所需的对象,而无需关心对象具体是如何创建的。这就好比我们在搭建积木时,只需要告诉建筑师我们想要搭建的结构,建筑师就会按照蓝图为我们准备好合适的积木,我们只需专注于如何将这些积木组合起来,而不用操心积木是如何生产和挑选的。
二、简单工厂模式的构成要素
简单工厂模式主要包含三个关键要素:工厂类、产品类和客户端,它们相互协作,共同构成了简单工厂模式的核心架构。下面,我将结合代码示例,深入剖析这三个要素在简单工厂模式中的具体作用和实现方式。假设我们正在开发一个图形绘制系统,需要绘制不同类型的图形,如圆形和矩形。
2.1 工厂类
工厂类是简单工厂模式的核心,就如同一家工厂的核心管理部门,负责实现创建所有产品实例的内部逻辑。在图形绘制系统中,我们可以定义一个ShapeFactory类作为工厂类,它提供一个静态方法createShape,该方法根据传入的参数决定创建哪种具体的图形对象。
public 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;
}
}
在上述代码中,ShapeFactory类的createShape方法接收一个shapeType参数,通过判断该参数的值,决定创建并返回Circle对象还是Rectangle对象。如果传入的参数既不是 "circle" 也不是 "rectangle",则返回null。这种方式将对象的创建逻辑集中在工厂类中,使得客户端在创建图形对象时,无需了解具体的创建细节,只需提供相应的参数即可。
2.2 产品类
产品类是简单工厂模式的重要组成部分,它包括抽象产品类和具体产品类。抽象产品类就像是产品的设计蓝图,定义了所有具体产品类需要实现的公共接口;具体产品类则是根据这个蓝图生产出来的实际产品,实现了抽象产品类中定义的接口。
在我们的图形绘制系统中,Shape接口就是抽象产品类,它定义了一个draw方法,用于绘制图形。而Circle类和Rectangle类则是具体产品类,它们分别实现了Shape接口的draw方法,提供了各自的绘制逻辑。
public interface Shape {
void draw();
}
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("绘制圆形");
}
}
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("绘制矩形");
}
}
在上述代码中,Shape接口定义了draw方法,Circle类和Rectangle类实现了该接口,并提供了各自的draw方法实现。这样,当客户端通过工厂类获取到具体的图形对象后,就可以调用其draw方法进行图形绘制,而无需关心具体的绘制实现。
2.3 客户端
客户端是简单工厂模式的使用者,它通过工厂类来获取所需的产品实例,并使用这些实例来完成具体的业务逻辑。在图形绘制系统中,客户端可以通过调用ShapeFactory类的createShape方法,传入相应的参数,获取到具体的图形对象,然后调用该对象的draw方法进行图形绘制。
public class Client {
public static void main(String[] args) {
Shape circle = ShapeFactory.createShape("circle");
if (circle != null) {
circle.draw();
}
Shape rectangle = ShapeFactory.createShape("rectangle");
if (rectangle != null) {
rectangle.draw();
}
}
}
在上述代码中,客户端首先调用ShapeFactory.createShape("circle")获取一个圆形对象,然后判断该对象是否为空,如果不为空,则调用其draw方法绘制圆形。接着,客户端调用ShapeFactory.createShape("rectangle")获取一个矩形对象,并同样判断是否为空后调用其draw方法绘制矩形。通过这种方式,客户端与具体产品类解耦,只与工厂类进行交互,使得代码的灵活性和可维护性得到了提高。
三、简单工厂模式代码实现剖析
接下来,让我们深入剖