目录
1、核心思想
目的:将对象创建的职责委托给工厂子类,实现对象实例化与适用的解耦。
优点:
解耦:将对象的创建与使用分离,降低代码耦合度。
扩展性:新增产品类型时,只需添加新的工厂子类,无需修改已有代码(符合开闭原则)。
多态性:客户端通过抽象接口操作对象,无需关心具体实现。
适用性:适合框架设计、跨平台组件、可插拔系统等需要灵活创建对象的场景
2、实现方式
2.1 模式结构
产品(Product):定义产品的抽象类或接口,同类产品的顶级父类。
子产品(ConcreteProduct):由产品类Product派生出的产品子类,实现抽象产品的具体类。
工厂接口(Factory):定义工厂方法的工厂接口,当然也可以是抽象类,它使顶级工厂制造方法抽象化、标准统一化。声明工厂方法(返回抽象产品类型)。
工厂实现(ConcreteFactory):实现了工厂接口的工厂实现类,返回具体产品实例。由工厂实现决定实例化哪个产品类。
2.2 实现案例
//1、产品
public interface Product {
void operate();
}
//2、子产品
// 具体产品A
public class ConcreteProductA implements Product {
@Override
public void operate() {
System.out.println("ProductA operation");
}
}
// 具体产品B
public class ConcreteProductB implements Product {
@Override
public void operate() {
System.out.println("ProductB operation");
}
}
//3、工厂接口
public abstract class Factory {
// 工厂方法(可能包含默认实现)
public abstract Product createProduct();
// 其他业务逻辑(可能与产品相关)
public void doSomething() {
Product product = createProduct();
product.operate();
}
}
//4、工厂实现
// 生产ProductA的工厂
public class ConcreteFactoryA extends Factory{
@Override
public Product createProduct() {
return new ConcreteProductA();
}
}
// 生产ProductB的工厂
public class ConcreteFactoryB extends Factory{
@Override
public Product createProduct() {
return new ConcreteProductB();
}
}
//5、客户端使用
public class Client {
public static void main(String[] args) {
Factory factory = new ConcreteFactoryA();
Product product = factory.createProduct();
product.operate(); // 输出:ProductA operation
factory = new ConcreteFactoryB();
factory.doSomething(); // 输出:ProductB operation
}
}
3、优缺点分析
优点 | 缺点 |
---|---|
符合开闭原则(扩展无需修改已有代码) | 类数量增加(每个产品需对应工厂类) |
客户端与具体类解耦 | 增加系统复杂度 |
支持多态性和动态绑定 | 需要预先设计抽象层级 |
4、适用场景
框架设计:允许用户扩展框架内部组件(如Spring的BeanFactory)。
跨平台开发:不同平台创建相同接口的对象(如UI组件)。
数据库访问:支持多种数据库驱动(MySQL/Oracle连接器)。
日志系统:输出到文件、网络或控制台的不同日志处理器。