Java设计模式之工厂方法模式详解

yizhihongxing

Java设计模式之工厂方法模式详解

什么是工厂方法模式?

工厂方法模式是一种创建型设计模式,它提供了一种将对象的创建委托给子类的方式。在工厂方法模式中,我们定义一个创建对象的接口,但是让子类决定实例化哪个类。这样可以将对象的创建与使用代码解耦,使得代码更加灵活和可扩展。

工厂方法模式的结构

工厂方法模式包含以下几个角色:

  1. 抽象产品(Product):定义了产品的接口,是具体产品类的共同父类。
  2. 具体产品(ConcreteProduct):实现了抽象产品接口的具体产品类。
  3. 抽象工厂(Factory):定义了创建产品的接口,包含一个创建产品的方法。
  4. 具体工厂(ConcreteFactory):实现了抽象工厂接口,负责创建具体产品的实例。

下面是一个示意图,展示了工厂方法模式的结构:

+-----------------+
|   抽象产品      |
+-----------------+
        /_\\
         |
+-----------------+
|  具体产品A     |
+-----------------+
         |
+-----------------+
|  具体产品B     |
+-----------------+

+-----------------+
|   抽象工厂      |
+-----------------+
        /_\\
         |
+-----------------+
|  具体工厂A     |
+-----------------+
         |
+-----------------+
|  具体工厂B     |
+-----------------+

工厂方法模式的示例

下面通过两个示例来说明工厂方法模式的使用。

示例一:创建不同类型的日志记录器

假设我们需要创建不同类型的日志记录器,包括文件日志记录器和数据库日志记录器。首先,我们定义一个抽象产品接口Logger,包含一个记录日志的方法log。然后,我们创建两个具体产品类FileLoggerDatabaseLogger,分别实现了抽象产品接口。接下来,我们定义一个抽象工厂接口LoggerFactory,包含一个创建日志记录器的方法createLogger。最后,我们创建两个具体工厂类FileLoggerFactoryDatabaseLoggerFactory,分别实现了抽象工厂接口,负责创建具体产品的实例。

// 抽象产品接口
public interface Logger {
    void log(String message);
}

// 具体产品类:文件日志记录器
public class FileLogger implements Logger {
    @Override
    public void log(String message) {
        System.out.println(\"FileLogger: \" + message);
    }
}

// 具体产品类:数据库日志记录器
public class DatabaseLogger implements Logger {
    @Override
    public void log(String message) {
        System.out.println(\"DatabaseLogger: \" + message);
    }
}

// 抽象工厂接口
public interface LoggerFactory {
    Logger createLogger();
}

// 具体工厂类:文件日志记录器工厂
public class FileLoggerFactory implements LoggerFactory {
    @Override
    public Logger createLogger() {
        return new FileLogger();
    }
}

// 具体工厂类:数据库日志记录器工厂
public class DatabaseLoggerFactory implements LoggerFactory {
    @Override
    public Logger createLogger() {
        return new DatabaseLogger();
    }
}

使用工厂方法模式的示例代码如下:

public class Main {
    public static void main(String[] args) {
        // 创建文件日志记录器工厂
        LoggerFactory fileLoggerFactory = new FileLoggerFactory();
        // 创建文件日志记录器
        Logger fileLogger = fileLoggerFactory.createLogger();
        // 记录日志
        fileLogger.log(\"This is a file log message.\");

        // 创建数据库日志记录器工厂
        LoggerFactory databaseLoggerFactory = new DatabaseLoggerFactory();
        // 创建数据库日志记录器
        Logger databaseLogger = databaseLoggerFactory.createLogger();
        // 记录日志
        databaseLogger.log(\"This is a database log message.\");
    }
}

运行以上代码,输出结果如下:

FileLogger: This is a file log message.
DatabaseLogger: This is a database log message.

示例二:创建不同类型的图形对象

假设我们需要创建不同类型的图形对象,包括圆形和矩形。首先,我们定义一个抽象产品接口Shape,包含一个绘制图形的方法draw。然后,我们创建两个具体产品类CircleRectangle,分别实现了抽象产品接口。接下来,我们定义一个抽象工厂接口ShapeFactory,包含一个创建图形对象的方法createShape。最后,我们创建两个具体工厂类CircleFactoryRectangleFactory,分别实现了抽象工厂接口,负责创建具体产品的实例。

// 抽象产品接口
public interface Shape {
    void draw();
}

// 具体产品类:圆形
public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println(\"Drawing a circle.\");
    }
}

// 具体产品类:矩形
public class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println(\"Drawing a rectangle.\");
    }
}

// 抽象工厂接口
public interface ShapeFactory {
    Shape createShape();
}

// 具体工厂类:圆形工厂
public class CircleFactory implements ShapeFactory {
    @Override
    public Shape createShape() {
        return new Circle();
    }
}

// 具体工厂类:矩形工厂
public class RectangleFactory implements ShapeFactory {
    @Override
    public Shape createShape() {
        return new Rectangle();
    }
}

使用工厂方法模式的示例代码如下:

public class Main {
    public static void main(String[] args) {
        // 创建圆形工厂
        ShapeFactory circleFactory = new CircleFactory();
        // 创建圆形对象
        Shape circle = circleFactory.createShape();
        // 绘制图形
        circle.draw();

        // 创建矩形工厂
        ShapeFactory rectangleFactory = new RectangleFactory();
        // 创建矩形对象
        Shape rectangle = rectangleFactory.createShape();
        // 绘制图形
        rectangle.draw();
    }
}

运行以上代码,输出结果如下:

Drawing a circle.
Drawing a rectangle.

总结

工厂方法模式是一种常用的创建型设计模式,它通过定义一个创建对象的接口,让子类决定实例化哪个类,从而将对象的创建与使用代码解耦。工厂方法模式可以提供灵活的扩展性,使得系统更易于维护和扩展。在实际应用中,我们可以根据具体的需求选择合适的工厂方法模式来创建对象。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java设计模式之工厂方法模式详解 - Python技术站

(0)
上一篇 2023年8月6日
下一篇 2023年8月6日

相关文章

  • logstash设置开机自启动

    以下是关于“logstash设置开机自启动”的完整攻略,包括设置方法和两个示例。 设置方法 在Linux系统中,可以使用systemd服务管理器来设置logstash的开机自启动。具体步骤如下: 创建logstash.service文件:在/etc/systemd/system/目录下创建logstash.service文件,文件内容如下: “` [Uni…

    other 2023年5月7日
    00
  • 完美解决EditText和ScrollView的滚动冲突(上)

    完美解决EditText和ScrollView的滚动冲突(上) 在Android开发中,当一个EditText位于一个ScrollView内部时,会出现滚动冲突的问题。当用户在EditText中输入文字时,ScrollView会自动滚动到EditText的位置,导致用户无法看到输入的内容。本攻略将详细介绍如何完美解决EditText和ScrollView的滚…

    other 2023年8月21日
    00
  • oracle数据库外连接

    以下是“Oracle数据库外连接”的完整攻略: Oracle数据库外连接 在Oracle数据库中,我们可以使用外连接(Outer Join)来查询两个或多个表中的数据。本攻略将详细讲解如何使用Oracle数据库外连接,包括左外连接、右外连接、全外连接等。 左外连接 左外连接(Left Outer Join)是指以左表为基础,将左表中的所有记录和右表中符合条件…

    other 2023年5月8日
    00
  • 几款好用的前端开发编辑器推荐安利

    当今的前端开发编辑器数量众多,有很多种选择,而且每个编辑器都有自己的优势和不足。下面介绍几款好用的前端开发编辑器,供大家选择。 Visual Studio Code Visual Studio Code 是一个涵盖了很多编程语言的轻量级代码编辑器,支持 Windows、Linux 和 Mac OS X 等操作系统,是目前最流行的前端编辑器之一。这个编辑器可以…

    other 2023年6月26日
    00
  • sc.exe用法详解

    sc.exe用法详解 sc.exe是Windows操作系统中的一个命令行工具,用于管理Windows服务。它可以用于创建、删除、启动、停止、查询和修改Windows服务。本文将详细讲sc.exe的用法,并提供两个示例说明。 1. 命令语法 sc.exe的命令语法如下: sc [ServerName] [Command] [ServiceName] [Opti…

    other 2023年5月8日
    00
  • SpringBoot使用spring.config.import多种方式导入配置文件

    Spring Boot 是一套围绕 Spring 的一站式开发框架,其中最关键的一个特性是约定大于配置,它提供了在默认情况下自动配置应用程序的功能。在 Spring Boot 应用程序中,如果你需要使用其他格式的配置文件而不是默认的 application.properties 或 application.yml 文件,那么可以通过使用 spring.con…

    other 2023年6月25日
    00
  • C语言基础之malloc和free函数详解

    C语言基础之malloc和free函数详解 在C语言中,malloc和free是用于动态内存分配和释放的两个重要函数。本文将详细讲解它们的使用方法和注意事项。 1. malloc函数 malloc函数用于在运行时动态分配内存空间。它的函数原型如下: void* malloc(size_t size); size参数表示要分配的内存空间的字节数。 malloc…

    other 2023年8月1日
    00
  • JQuery操作三大控件(下拉,单选,复选)的方法

    JQuery是一种流行的JavaScript库,提供了丰富的API和方法来简化JavaScript编程。在Web开发中,下拉框、单选框和复选框是非常常见的控件,JQuery提供了方便的方法来操作这些控件。以下是“JQuery操作三大控件(下拉,单选,复选)的方法”完整攻略: 操作下拉框 获取下拉框选中的值 可以使用 .val() 方法获取下拉框当前选中的值。…

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