一、引言
工厂模式(Factory Pattern)是Java中常用的一种创建型设计模式,它提供了一种封装机制,将对象的创建与使用分离,使得代码结构更加清晰,同时降低了对象之间的耦合度。工厂模式主要解决了“对象如何创建”的问题,使得我们可以使用相同的接口来创建不同的对象。
二、工厂模式的分类
工厂模式主要分为三种:简单工厂模式(Simple Factory Pattern)、工厂方法模式(Factory Method Pattern)和抽象工厂模式(Abstract Factory Pattern)。下面我们将逐一介绍这三种模式,并给出相应的代码样例。
- 简单工厂模式
简单工厂模式(Simple Factory Pattern)也称为静态工厂方法模式,由一个工厂对象决定哪一个产品类应该被实例化。该模式将对象的创建与使用分离,使得代码更加清晰。但是,简单工厂模式有一个缺点,即当需要增加新的产品时,需要修改工厂类的代码,这违反了开闭原则(对扩展开放,对修改关闭)。
代码样例:
// 产品接口
public interface Car {
void drive();
}
// 产品实现类
public class BMW implements Car {
@Override
public void drive() {
System.out.println("Driving BMW");
}
}
public class Benz implements Car {
@Override
public void drive() {
System.out.println("Driving Benz");
}
}
// 工厂类
public class CarFactory {
public static Car createCar(String type) {
if ("BMW".equals(type)) {
return new BMW();
} else if ("Benz".equals(type)) {
return new Benz();
} else {
return null;
}
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
Car bmw = CarFactory.createCar("BMW");
bmw.drive();
Car benz = CarFactory.createCar("Benz");
benz.drive();
}
}
- 工厂方法模式
工厂方法模式(Factory Method Pattern)定义了一个创建对象的接口,但让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。这样,我们可以将对象的创建与使用分离,同时避免了简单工厂模式的缺点。
代码样例:
// 产品接口
// ... 同简单工厂模式
// 产品实现类
// ... 同简单工厂模式
// 抽象工厂接口
public interface CarFactory {
Car createCar();
}
// 工厂实现类
public class BMWFactory implements CarFactory {
@Override
public Car createCar() {
return new BMW();
}
}
public class BenzFactory implements CarFactory {
@Override
public Car createCar() {
return new Benz();
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
CarFactory bmwFactory = new BMWFactory();
Car bmw = bmwFactory.createCar();
bmw.drive();
CarFactory benzFactory = new BenzFactory();
Car benz = benzFactory.createCar();
benz.drive();
}
}
- 抽象工厂模式
抽象工厂模式(Abstract Factory Pattern)提供了一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。抽象工厂模式允许客户使用抽象的接口来创建一组相关的产品族,而不需要知道实际产出的具体产品是什么。这样客户只需要关心产品的接口,而不关心具体实现。
由于抽象工厂模式涉及多个产品族和多个产品等级结构,代码样例相对复杂,这里不再给出具体的代码实现。
三、总结
工厂模式是一种常用的创建型设计模式,它将对象的创建与使用分离,使得代码结构更加清晰,同时降低了对象之间的耦合度。在实际开发中,我们可以根据具体需求选择适合的工厂模式来实现代码的解耦和复用。