Java工厂模式怎么写
工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式,而无需指定将要创建的对象的具体类,在Java中,工厂模式广泛应用于需要动态创建对象的场景,能够有效降低系统模块之间的耦合度,提高代码的可扩展性和可维护性,本文将详细介绍工厂模式的分类、实现方式及实际应用场景。

工厂模式的核心思想
工厂模式的核心思想是将对象的创建过程封装在一个独立的类中,客户端无需关心具体的创建逻辑,只需通过工厂类获取所需的对象即可,这种模式遵循了“开闭原则”,即对扩展开放,对修改关闭,当需要新增产品类型时,只需新增对应的工厂类或产品类,而无需修改现有的代码结构。
工厂模式的分类
工厂模式主要分为三种:简单工厂模式、工厂方法模式和抽象工厂模式,每种模式在复杂度和适用场景上有所不同,开发者可根据实际需求选择合适的实现方式。
简单工厂模式
简单工厂模式不属于23种经典设计模式之一,但因其实现简单而被广泛使用,它通过一个工厂类负责创建所有产品类的实例,客户端通过传入不同的参数来获取不同的对象。
实现步骤:
- 定义一个产品接口(或抽象类),声明公共方法。
- 创建多个具体产品类,实现产品接口。
- 创建一个工厂类,提供静态方法用于创建具体产品对象。
示例代码:
// 产品接口
interface Product {
void use();
}
// 具体产品A
class ConcreteProductA implements Product {
public void use() { System.out.println("使用产品A"); }
}
// 具体产品B
class ConcreteProductB implements Product {
public void use() { System.out.println("使用产品B"); }
}
// 工厂类
class SimpleFactory {
public static Product createProduct(String type) {
if ("A".equals(type)) {
return new ConcreteProductA();
} else if ("B".equals(type)) {
return new ConcreteProductB();
}
throw new IllegalArgumentException("未知产品类型");
}
}
// 客户端调用
public class Client {
public static void main(String[] args) {
Product productA = SimpleFactory.createProduct("A");
productA.use();
Product productB = SimpleFactory.createProduct("B");
productB.use();
}
}
优点:客户端代码简单,只需传入参数即可获取对象。
缺点:工厂类承担了所有产品的创建逻辑,违反了“单一职责原则”,当产品类型增多时,工厂类会变得臃肿。

工厂方法模式
工厂方法模式是简单工厂模式的升级版,它定义一个用于创建对象的接口,但让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。
实现步骤:
- 定义一个抽象工厂类,声明工厂方法。
- 创建多个具体工厂类,实现工厂方法,返回具体产品对象。
示例代码:
// 产品接口
interface Product {
void use();
}
// 具体产品A
class ConcreteProductA implements Product {
public void use() { System.out.println("使用产品A"); }
}
// 具体产品B
class ConcreteProductB implements Product {
public void use() { System.out.println("使用产品B"); }
}
// 抽象工厂
interface AbstractFactory {
Product createProduct();
}
// 具体工厂A
class ConcreteFactoryA implements AbstractFactory {
public Product createProduct() {
return new ConcreteProductA();
}
}
// 具体工厂B
class ConcreteFactoryB implements AbstractFactory {
public Product createProduct() {
return new ConcreteProductB();
}
}
// 客户端调用
public class Client {
public static void main(String[] args) {
AbstractFactory factoryA = new ConcreteFactoryA();
Product productA = factoryA.createProduct();
productA.use();
AbstractFactory factoryB = new ConcreteFactoryB();
Product productB = factoryB.createProduct();
productB.use();
}
}
优点:符合“开闭原则”,新增产品类型时只需新增具体工厂类,无需修改现有代码。
缺点:每增加一个产品,就需要增加一个具体工厂类,导致类数量增多。
抽象工厂模式
抽象工厂模式提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们的具体类,它适用于产品族较多的场景,例如创建不同操作系统的UI组件(按钮、文本框等)。
实现步骤:

- 定义多个产品接口(如Button、TextField)。
- 创建多个具体产品族,实现产品接口。
- 定义抽象工厂接口,声明创建产品族的方法。
- 创建具体工厂类,实现抽象工厂接口,返回对应的产品族对象。
示例代码:
// 产品接口
interface Button {
void click();
}
interface TextField {
void input();
}
// 具体产品族A
class WindowsButton implements Button {
public void click() { System.out.println("Windows按钮点击"); }
}
class WindowsTextField implements TextField {
public void input() { System.out.println("Windows文本框输入"); }
}
// 具体产品族B
class MacButton implements Button {
public void click() { System.out.println("Mac按钮点击"); }
}
class MacTextField implements TextField {
public void input() { System.out.println("Mac文本框输入"); }
}
// 抽象工厂
interface AbstractFactory {
Button createButton();
TextField createTextField();
}
// 具体工厂A
class WindowsFactory implements AbstractFactory {
public Button createButton() { return new WindowsButton(); }
public TextField createTextField() { return new WindowsTextField(); }
}
// 具体工厂B
class MacFactory implements AbstractFactory {
public Button createButton() { return new MacButton(); }
public TextField createTextField() { return new MacTextField(); }
}
// 客户端调用
public class Client {
public static void main(String[] args) {
AbstractFactory windowsFactory = new WindowsFactory();
Button windowsButton = windowsFactory.createButton();
windowsButton.click();
TextField windowsTextField = windowsFactory.createTextField();
windowsTextField.input();
AbstractFactory macFactory = new MacFactory();
Button macButton = macFactory.createButton();
macButton.click();
TextField macTextField = macFactory.createTextField();
macTextField.input();
}
}
优点:确保产品族内的对象是兼容的,客户端代码与具体产品解耦。
缺点:扩展产品族困难,需要修改抽象工厂接口和所有具体工厂类。
工厂模式的应用场景
- 对象创建逻辑复杂:当对象的创建过程涉及多个步骤或依赖其他对象时,工厂模式可以封装这些逻辑,简化客户端代码。
- 需要降低系统耦合度:通过工厂模式,客户端与具体产品类解耦,便于系统的维护和扩展。
- 需要支持多种产品族:如抽象工厂模式适用于需要创建一系列相关对象的场景,如跨平台的UI组件库。
工厂模式的注意事项
- 避免过度使用:如果对象的创建逻辑非常简单,直接通过
new关键字创建即可,无需引入工厂模式。 - 选择合适的模式:根据产品数量和产品族的复杂度选择简单工厂、工厂方法或抽象工厂模式。
- 结合反射机制:在工厂方法模式中,可以通过反射动态创建对象,减少工厂类的数量。
工厂模式是Java中常用的设计模式之一,通过封装对象的创建过程,提高了代码的灵活性和可维护性,简单工厂模式适用于产品类型较少的场景,工厂方法模式适用于需要扩展产品的场景,而抽象工厂模式则适用于产品族较多的复杂系统,在实际开发中,应根据具体需求选择合适的工厂模式,并遵循“开闭原则”和“单一职责原则”,以设计出高质量的代码。















