【设计模式】工厂模式
工厂方法模式深度解析:对象创建的优雅之道一、工厂方法模式核心概念
工厂方法模式(Factory Method Pattern)是一种创建型设计模式,定义了一个创建对象的接口,但让子类决定实例化哪一个类。它将对象的实例化过程推迟到子类,实现了创建者与具体产品的解耦。
核心价值:
[*]✅ 解耦创建逻辑:将对象创建代码与使用代码分离
[*]✅ 扩展性强:新增产品类型只需添加新工厂
[*]✅ 符合开闭原则:不修改已有代码即可扩展系统
[*]✅ 统一创建入口:提供一致的实例化接口
二、为什么需要工厂方法模式?
当遇到以下场景时,工厂方法模式是理想选择:
[*]创建逻辑复杂:对象创建需要多步初始化或条件判断
[*]系统需要扩展:预期未来会新增产品类型
[*]依赖抽象而非实现:客户端不应依赖具体类
[*]资源统一管理:如数据库连接、线程池等资源的创建
graph LR Client --> Creator[创建者接口] Creator --> ConcreteCreatorA[具体创建者A] Creator --> ConcreteCreatorB[具体创建者B] ConcreteCreatorA --> ProductA[具体产品A] ConcreteCreatorB --> ProductB[具体产品B]三、工厂方法模式实现方式大全
1. 基础实现(标准模式)
// 产品接口
interface Transport {
void deliver();
}
// 具体产品
class Truck implements Transport {
@Override
public void deliver() {
System.out.println("陆路运输:卡车送货");
}
}
class Ship implements Transport {
@Override
public void deliver() {
System.out.println("海运:货轮送货");
}
}
// 创建者接口
interface Logistics {
Transport createTransport();
}
// 具体创建者
class RoadLogistics implements Logistics {
@Override
public Transport createTransport() {
return new Truck();
}
}
class SeaLogistics implements Logistics {
@Override
public Transport createTransport() {
return new Ship();
}
}
// 客户端使用
public class Client {
public static void main(String[] args) {
Logistics logistics = new RoadLogistics();
Transport transport = logistics.createTransport();
transport.deliver(); // 输出:陆路运输:卡车送货
}
}2. 参数化工厂方法
enum TransportType { TRUCK, SHIP, AIRPLANE }
abstract class Logistics {
// 参数化工厂方法
public Transport createTransport(TransportType type) {
switch (type) {
case TRUCK: return new Truck();
case SHIP: return new Ship();
case AIRPLANE: return new Airplane();
default: throw new IllegalArgumentException("未知运输类型");
}
}
// 业务方法
public void planDelivery() {
Transport t = createTransport(getTransportType());
t.deliver();
}
// 抽象方法由子类实现
protected abstract TransportType getTransportType();
}
// 具体创建者
class FastLogistics extends Logistics {
@Override
protected TransportType getTransportType() {
return TransportType.AIRPLANE;
}
}3. 使用Lambda表达式(Java 8+)
interface TransportFactory {
Transport create();
}
public class LambdaFactory {
public static void main(String[] args) {
// 使用Lambda实现工厂
TransportFactory truckFactory = Truck::new;
TransportFactory shipFactory = Ship::new;
Transport t1 = truckFactory.create();
Transport t2 = shipFactory.create();
t1.deliver(); // 输出:陆路运输:卡车送货
t2.deliver(); // 输出:海运:货轮送货
}
}4. 带初始化参数的工厂
interface TransportFactory {
Transport create(String model, double capacity);
}
class TruckFactory implements TransportFactory {
@Override
public Transport create(String model, double capacity) {
Truck truck = new Truck();
truck.setModel(model);
truck.setCapacity(capacity);
return truck;
}
}
// 客户端使用
Transport heavyTruck = new TruckFactory()
.create("Heavy-Duty", 20.0);四、工厂方法模式原理深度剖析
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页:
[1]