工厂方法模式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

相关推荐

  1. 工厂方法模式

    2024-02-23 04:36:01       59 阅读
  2. 工厂方法模式

    2024-02-23 04:36:01       35 阅读
  3. 设计模式-工厂方法模式

    2024-02-23 04:36:01       62 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-23 04:36:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-23 04:36:01       101 阅读
  3. 在Django里面运行非项目文件

    2024-02-23 04:36:01       82 阅读
  4. Python语言-面向对象

    2024-02-23 04:36:01       91 阅读

热门阅读

  1. vs code Conda退出虚拟环境报错 ERROR REPORT

    2024-02-23 04:36:01       62 阅读
  2. docker 的volume 是个什么概念

    2024-02-23 04:36:01       52 阅读
  3. C语言——static的三大用法

    2024-02-23 04:36:01       55 阅读
  4. 怎么使用Git进行版本恢复

    2024-02-23 04:36:01       47 阅读
  5. golang 读取压缩包文件 && 写文件

    2024-02-23 04:36:01       54 阅读
  6. 【Go】五、Grpc 的入门使用

    2024-02-23 04:36:01       38 阅读
  7. 编程笔记 Golang基础 012 项目构建

    2024-02-23 04:36:01       44 阅读
  8. c语言实现模块度算法

    2024-02-23 04:36:01       52 阅读
  9. rust实战系列十四:复合数据类型

    2024-02-23 04:36:01       46 阅读
  10. python子域名收集工具

    2024-02-23 04:36:01       43 阅读
  11. 3.Swift导航栏的使用

    2024-02-23 04:36:01       51 阅读
  12. 【Swift】NSPopUpButton用法和示例

    2024-02-23 04:36:01       55 阅读
  13. JBOSS EPA 7.X 接入Oracle数据源

    2024-02-23 04:36:01       49 阅读