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日

相关文章

  • Spring Batch 如何自定义ItemReader

    下面就来详细讲解 Spring Batch 如何自定义ItemReader 的完整攻略。 什么是 ItemReader 在 Spring Batch 中,ItemReader 是读取数据的一个接口。它的作用是读取数据到 Step 的 ExecutionContext 中,然后由 Step 处理数据。 Spring Batch 中已经提供了多种类型的 Item…

    Java 2023年6月16日
    00
  • jQuery ajax全局函数处理session过期后的ajax跳转问题

    解决jQuery AJAX全局函数处理Session过期后的跳转问题,可以按照以下步骤进行操作: 步骤1: 创建全局函数 在jQuery中,通过$.ajaxSetup()方法来实现全局函数,该方法用于设置AJAX请求的全局默认选项。使用该方法设置beforeSend函数,当AJAX请求将会被发送之前被调用,并且我们可以在该函数中检查SESSION是否过期,如…

    Java 2023年6月16日
    00
  • formvalidator验证插件中有关ajax验证问题

    下面是关于formvalidator验证插件中有关ajax验证问题的完整攻略。 什么是formvalidator? formvalidator是一款轻量级的表单验证插件,使用简单方便,支持多种验证方式,包括required(必填项)、email(电子邮件格式)、phone(电话号码格式)等等。 为什么需要ajax验证? 当我们需要在表单中验证某些内容时,有些…

    Java 2023年5月20日
    00
  • 详解Java编程中线程同步以及定时启动线程的方法

    下面是详解Java编程中线程同步以及定时启动线程的方法的完整攻略。 一、线程同步 在Java中,线程同步是控制多个线程访问共享资源的一种方式,主要是通过使用锁来实现的。Java中提供了两种锁来实现线程同步,分别是 synchronized 关键字和 ReentrantLock 类。 1. synchronized synchronized 是Java中最基本…

    Java 2023年5月20日
    00
  • Spring Boot:Idea从零开始初始化后台项目的教程

    完整讲解”Spring Boot: Idea从零开始初始化后台项目的教程”的攻略可以分为以下几个步骤: 环境准备首先,需要准备好JDK、IDEA和Spring Boot。确保它们都已经安装在你的电脑上,并且配置好了环境变量。 创建Spring Boot项目在IntelliJ IDEA中创建一个新的Spring Boot项目,你可以选择它的版本和其他设置。接着…

    Java 2023年5月19日
    00
  • Java中try、catch的使用方法

    下面是Java中try、catch的使用方法的完整攻略。 概述 Java中的try-catch是一种异常处理机制,我们可以在try块中编写可能会产生异常(错误)的代码,如果代码块中的操作出现了问题,程序将会抛出一个异常,执行流会跳转到catch块中进行异常处理。 使用方法 try块中的代码可能会出现异常,我们可以使用以下语法进行异常的捕获和处理: try {…

    Java 2023年5月26日
    00
  • Java Stream API 使代码更出色的操作完全攻略

    Java Stream API 使代码更出色的操作完全攻略 Java Stream API 是一个用于处理集合的 API,它允许以声明性方式处理数据。使用流,我们可以过滤、转换、聚合和排序数据,而无需编写大量的循环和条件语句。本文将教你如何使用 Java Stream API 让你的代码更加简洁和易于理解。 创建流 使用 Java Stream API,我们…

    Java 2023年5月23日
    00
  • SpringMVC接收多个对象的4种方法

    在Spring MVC中,接收多个对象是一个常见的需求。Spring MVC提供了多种方式来接收多个对象,包括使用数组、List、Map等。下面是Spring MVC接收多个对象的4种方法的详细攻略: 1. 使用数组 使用数组可以接收多个对象,例如: @PostMapping("/users") public String addUser…

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