Java工厂模式用法之如何动态选择对象详解

Java工厂模式用法之如何动态选择对象详解

工厂模式简介

在软件开发中经常需要创建对象,由于创建对象过程比较复杂,因此我们通常利用工厂模式来创建对象。工厂模式是指定义一个用于创建对象的接口(工厂接口),由实现这个接口的类(具体工厂)来创建具体的对象(产品)。在工厂模式中,客户端不直接 new 一个类的实例,而是通过工厂接口来创建实例,从而将实例的创建和使用代码解耦。

工厂模式的用法

工厂模式可以根据需要创建不同类型的对象,先定义一个工厂接口,根据不同的输入来返回不同的实例对象。

工厂接口

定义一个工厂接口:

public interface ProductFactory {
    public Product create(String type);
}

这个工厂接口有一个 create 方法,输入一个 type,返回一个产品实例对象。这个工厂接口是用来抽象化具体工厂的,具体工厂通过继承这个工厂接口实现具体工厂类。

具体工厂

假设现在有两种产品,分别为 ProductA 和 ProductB。那么我们就可以分别创建 ProductAFactory 和 ProductBFactory 两个具体工厂来分别生产 ProductA 和 ProductB 两种产品。

// ProductAFactory.java
public class ProductAFactory implements ProductFactory {
    public Product create(String type) {
        if(type.equals("A")) {
            return new ProductA();
        }
        return null;
    }
}

// ProductBFactory.java
public class ProductBFactory implements ProductFactory {
    public Product create(String type) {
        if(type.equals("B")) {
            return new ProductB();
        }
        return null;
    }
}

这两个具体工厂实现了工厂接口,实现了 ProductFactory 中的 create 方法,当输入为 "A" 时,ProductAFactory 创建 ProductA 实例对象;当输入为 "B" 时,ProductBFactory 创建 ProductB 实例对象。

产品实现

具体的产品是由具体工厂来创建的,这里我们分别实现 ProductA 和 ProductB:

// ProductA.java
public class ProductA implements Product {
    public void method() {
        System.out.println("This is ProductA");
    }
}

// ProductB.java    
public class ProductB implements Product {
    public void method() {
        System.out.println("This is ProductB");
    }
}

这两个产品实现了一个共同的接口 Product,这个接口定义了方法 method,具体产品实现这个方法。

调用示例

通过工厂模式,我们可以根据输入的 type 动态选择具体的 产品实现。这里有一个示例,根据输入的 type 来创建 ProductA 或 ProductB 对象:

public static void main(String[] args) {
    String type = "A";
    ProductFactory factory = null;
    Product product = null;
    if(type.equals("A")) {
        factory = new ProductAFactory();
    } else if(type.equals("B")) {
        factory = new ProductBFactory();
    }
    product = factory.create(type);
    if(product != null) {
        product.method();
    } else {
        System.out.println("Invalid type!");
    }
}

输入 type 为 "A" 时,创建 ProductA 实例对象并调用 method 方法输出 "This is ProductA",输入 type 为 "B" 时,创建 ProductB 实例对象并调用 method 方法输出 "This is ProductB"。如果输入的 type 不是 "A" 或 "B",则输出 "Invalid type!"。

示例2

我们继续以上面的工厂类为例,为了精简代码,这里我们使用反射来动态创建具体的工厂对象。

我们可以定义一个工厂类来统一实例化具体工厂类的对象,这样能够有效的减少代码量,并增加代码的灵活性。

工厂类

public class Factory {
    public static ProductFactory createFactory(String className) {
        try {
            Class cls = Class.forName(className);
            ProductFactory factory = (ProductFactory) cls.newInstance();
            return factory;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

这个工厂类根据传进来的具体工厂类名(className),反射实例化具体工厂类对象,并返回一个 ProductFactory 接口类型对象。这样通过动态加载具体类,在代码中就可以通过字符串来动态创建具体的工厂实例。

调用示例

public static void main(String[] args) {
    String className = "com.example.ProductAFactory";
    String type = "A";
    ProductFactory factory = Factory.createFactory(className);
    Product product = factory.create(type);
    if(product != null) {
        product.method();
    } else {
        System.out.println("Invalid type!");
    }
}

这个示例中,字符串 className 传入了具体工厂类的全路径名,通过反射创建具体的工厂对象,并通过 type 来创建具体的产品对象。这种方法可以在运行时动态选择具体类来实例化对象,非常灵活。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java工厂模式用法之如何动态选择对象详解 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • springboot快速整合Mybatis组件的方法(推荐)

    下面是关于springboot快速整合Mybatis组件的方法的攻略,包括以下几个步骤: 1.基础环境搭建 首先,我们应该新建一个SpringBoot工程,选择maven进行构建。我们需要在pom.xml文件中添加Mybatis和Mybatis-spring-boot-starter依赖项。核心代码如下: <dependency> <gro…

    Java 2023年5月19日
    00
  • JSP中out对象的实例详解

    下面是本人为大家准备的详细讲解“JSP中out对象的实例详解”的攻略。 JSP中out对象的实例详解 1. out对象简介 在JSP页面中,out对象是一个内置对象,用于向客户端输出内容。 2. out对象的创建 当在JSP页面中使用语句 out.print(“hello, world”) 时,就会自动创建一个名为 “out” 的输出流对象。 3. out对…

    Java 2023年6月15日
    00
  • springboot项目中jackson-序列化-处理 NULL教程

    安装Jackson依赖 在 Spring Boot 项目中使用 Jackson 进行数据序列化和反序列化时,需要先在项目中添加 Jackson依赖。 <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-da…

    Java 2023年5月26日
    00
  • 海量数据去重排序bitmap(位图法)在java中实现的两种方法

    海量数据去重排序bitmap(位图法)是一种高效的数据处理方法,可以有效提升数据处理的效率。在Java中实现海量数据去重排序bitmap(位图法)可以采用以下两种方法: 1. 使用Java BitSet类实现位图法 1.1 初始数据的准备 在使用位图法进行去重排序之前,需要先将原始数据以字符串的形式进行处理,并按照一定规则转化为二进制码。在这个例子中,我们将…

    Java 2023年5月26日
    00
  • java 读取文件路径空格、”+”和中文的处理方法

    当我们在Java中读取文件时,可能会遇到文件路径中存在空格、”+”、中文等特殊字符的情况。本文将为大家介绍Java读取包含特殊字符的文件路径的解决方法。 使用ESC转义特殊字符 在Java中,可以使用转义字符“\”来处理特殊字符。当文件路径中存在空格、”+”和中文等特殊字符时,可以使用“\”来转义这些字符。 下面是一个例子: String filePath …

    Java 2023年5月20日
    00
  • Java 数据库连接池 Tomcat介绍

    Java 数据库连接池 Tomcat介绍 什么是数据库连接池 数据库连接池(Database Connection Pool)是一种在应用程序和数据库之间建立和维护连接的技术。它可以减轻应用程序频繁创建和销毁数据库连接的负担,从而提高应用程序的性能。 Tomcat中的数据库连接池 在Tomcat中,我们可以使用Tomcat提供的JDBC连接池,来实现对数据库…

    Java 2023年5月19日
    00
  • 20个非常实用的Java程序代码片段

    以下是“20个非常实用的Java程序代码片段”的完整攻略: 1. 倒序输出字符串 可以使用StringBuilder的reverse()方法,将字符串倒序输出: String str = "hello world"; String reversedStr = new StringBuilder(str).reverse().toStrin…

    Java 2023年5月19日
    00
  • mybatisplus添加真正的批量新增、批量更新的实现

    下面我给您详细讲解一下“mybatisplus添加真正的批量新增、批量更新的实现”的完整攻略。 理解MyBatis-Plus MyBatis-Plus是基于MyBatis的快速开发框架,提供一系列的增强功能,能够更加方便、快捷地开发数据库相关操作。其中,其批量操作功能得到了广泛的关注和应用。本文详细介绍了MyBatis-Plus批量新增、批量更新的实现方式。…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部