工厂方法模式Factory Method

1.模式定义

定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使得一个类的实例化延迟到子类

2.使用场景

1.当你不知道改使用对象的确切类型的时候
2.当你希望为库或框架提供扩展其内部组件的方法时

主要优点:

1.将具体产品和创建者解耦
2.符合单一职责原则
3.符合开闭原则

3.具体实现

3.1 代码示例

简单工厂:

复制代码
// 简单工厂
class SimpleFactory {
    public static Product createProduct(String type) {
        if ("A".equals(type)) {
            return new ProductA();
        } else if ("B".equals(type)) {
            return new ProductB();
        } else {
            return null;
        }
    }
}

工厂方法

复制代码
// 工厂方法
abstract class ProductFactory {

    /**
     * 创建产品
     *
     * @return
     */
    abstract Product createProduct();

    public Product getObject() {
        Product product = createProduct();
        return product;
    }
}

class NonCreateProductA extends ProductFactory {

    @Override
    Product createProduct() {
        return new ProductA();
    }
}

class NonCreateProductB extends ProductFactory {

    @Override
    Product createProduct() {
        return new ProductB();
    }
}

示例代码

复制代码
// 实例代码
interface Product {
    String getName();
}

class ProductA implements Product {

    @Override
    public String getName() {
        return "Name's product A";
    }
}

class ProductB implements Product {

    @Override
    public String getName() {
        return "Name's product B";
    }
}

测试代码

复制代码
public class FactoryMethodTest {
    public static void main(String[] args) {
        // 简单工厂测试代码
        Product simpleA = SimpleFactory.createProduct("A");
        System.out.println(simpleA.getName());
        Product simpleB = SimpleFactory.createProduct("B");
        System.out.println(simpleB.getName());

        // 工厂方法测试代码
        Product pa = new NonCreateProductA().getObject();
        System.out.println(pa.getName());

        Product pb = new NonCreateProductB().getObject();
        System.out.println(pb.getName());
    }

}

3.2 源码中的应用

复制代码
// java api
// 静态工厂方法
Calendar.getInstance()
java.text.NumberFormat.getInstance()
java.util.ResourceBundle.getBundle()

// 工厂方法
java.net.URLStreamHandlerFactory
javax.xml.bind.JAXBContext.createMarshaller
相关推荐
Highcharts.js4 小时前
教程:基于 React + Highcharts 构建一个单页应用程序、按需数据拉取与图表渲染
开发语言·前端·数据结构·react.js·前端框架·highcharts·页面应用
头发还在的女程序员5 小时前
医院陪诊管理系统怎么选择?——2026 年选型避坑与架构参考
java·开发语言·陪诊系统·陪诊app·医院陪诊陪护
CodeStats6 小时前
【Spring事务】Spring事务注解 @Transactional 完整体系:从 MySQL 隔离级别到 MyBatis 原理详解
java·spring·mybatis·事务·transactional
我命由我123456 小时前
Android 开发问题:为 PDFView 设置一个带有黑色边框的背景 drawable,但边框没有生效
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
爱写代码的小朋友7 小时前
从零开始学 Win32 API:C++ 窗口编程实战(VS Code + MinGW-w64 命令行详解)
开发语言·c++
果汁华7 小时前
Function Calling 与 Python 实战完整指南
开发语言·网络·python
小小晓.8 小时前
C++:语句和作用域
开发语言·c++
都叫我大帅哥8 小时前
从Python到Java:为什么企业级Agent最终会选择Java?
java·ai编程
wanderist.9 小时前
Lambda表达式在算法竞赛中的应用
java·开发语言·算法
海天鹰9 小时前
PHP上传文件
android·开发语言·php