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

yizhihongxing

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开发的第一个web入门程序的实现

    使用Spring Boot开发的第一个Web入门程序的实现 Spring Boot是一个流行的Java框架,可以帮助开发人员快速构建和部署应用程序。本文将详细讲解如何使用Spring Boot开发第一个Web入门程序,包括创建Spring Boot项目、编写控制器和视图、运行应用程序等。 1. 创建Spring Boot项目 首先,我们需要创建一个Sprin…

    Java 2023年5月14日
    00
  • 关于C#继承的简单应用代码分析

    下面就是“关于C#继承的简单应用代码分析”的攻略: 什么是继承? 在面向对象的编程中,继承是一个重要的概念。继承是指一个类可以从另一个类中继承其成员,包括字段和方法。从父类继承的成员可以被子类直接使用,也可以被子类重写。 如何使用继承? 在C#中,使用冒号(:)来指示一个类继承自另一个类。例如: class Animal { public void Eat(…

    Java 2023年5月19日
    00
  • SSh结合Easyui实现Datagrid的分页显示

    下面是关于“SSh结合Easyui实现Datagrid的分页显示”的完整攻略。 1. 准备工作 首先,你需要在服务器上部署好SSH,并安装好Easyui。其中Easyui用于实现Datagrid的分页等相关功能。 2. 创建Datagrid 在创建Datagrid时,我们需要在HTML页面中添加以下代码: <table id="datagri…

    Java 2023年5月20日
    00
  • Java的引用类型常用的四种方法

    Java的引用类型常用的四种方法包含:按值传递、按引用传递、按可变长数组传递、按包装类传递。接下来我会结合示例详细介绍这四种方法。 按值传递 按值传递是将方法外部的值复制到方法内部,在方法中操作该值,但不会对原始值造成影响。示例代码如下: public class Main { public static void main(String[] args) {…

    Java 2023年5月26日
    00
  • Spring中使用LocalDateTime、LocalDate等参数作为入参

    使用Java 8的新日期时间API(java.time包)中的LocalDateTime、LocalDate等参数作为方法入参,是Spring中常用的技巧。下面是Spring中使用LocalDateTime、LocalDate等参数作为入参的完整攻略: 在Controller中使用LocalDateTime参数作为入参 步骤一:在Controller中定义R…

    Java 2023年5月20日
    00
  • 详解nodejs爬虫程序解决gbk等中文编码问题

    下面给出 “详解nodejs爬虫程序解决gbk等中文编码问题”的完整攻略。 背景 在编写爬虫程序时,如果在抓取中文网页时,如果网页编码为 gbk 或其他不是 utf-8 的编码,那么会因为编码不匹配而出现乱码,无法正确获取中文数据。因此必须对编码进行转换。 解决方法 方法一:使用iconv-lite包 iconv-lite 是一个将字符串从一种字符编码转换为…

    Java 2023年6月1日
    00
  • 一文掌握Spring Boot 日志文件

    一文掌握Spring Boot日志文件 在Spring Boot应用程序中,日志文件是非常重要的。它们可以帮助我们诊断和解决问题,同时也可以提供有用的信息,例如应用程序的性能和行为。在本文中,我们将介绍如何配置和使用Spring Boot日志文件,并提供两个示例。 配置Spring Boot日志文件 Spring Boot支持多种日志框架,例如Logback…

    Java 2023年5月15日
    00
  • jdbc实现图书馆借阅系统

    JDBC实现图书馆借阅系统 简介 JDBC是Java Database Connectivity的缩写,是Java语言访问数据库的标准API,它提供了一套标准的Java接口,用于访问各种关系型数据库系统。本文将介绍如何使用JDBC实现图书馆借阅系统。 步骤 1. 加载数据库驱动 为了使用JDBC访问数据库,我们需要先加载数据库驱动。在这里以MySQL数据库为…

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