Java工厂模式优雅地创建对象以及提高代码复用率和灵活性

Java工厂模式优雅地创建对象以及提高代码复用率和灵活性

什么是工厂模式

在面向对象编程中,将对象的创建过程和处理过程分离开来就是一种算法模式。这种算法模式就是工厂模式。简单来说,工厂模式就是将对象的创建过程进行封装和统一管理,使得代码更加灵活和便于维护和修改。工厂模式主要有两种形式:简单工厂模式和抽象工厂模式。

简单工厂模式

简单工厂模式是工厂模式中最简单的一种形式,它将产品的实现类的创建过程进行封装,通过向工厂传入不同的参数来创建不同的产品实例。

示例:汽车制造工厂

例如,一个汽车制造工厂需要根据不同的订单来生产不同的汽车,其中不同类型的汽车都拥有相同的基本属性和方法,如车轮数、马力、加速度和刹车等。根据订单生产汽车的过程可以使用简单工厂模式进行封装,使得代码更加灵活和易于维护。

首先,我们定义一个接口类 Car,其中包括了汽车的基本属性和方法:

public interface Car {
    void run();
    void stop();
    void description();
}

然后,我们定义不同类型汽车的实现类,并实现上述接口:

public class SportsCar implements Car {
    public void run() {
        System.out.println("Sports car is running...");
    }
    public void stop() {
        System.out.println("Sports car is stopping...");
    }
    public void description() {
        System.out.println("This is a sports car.");
    }
}

public class SUV implements Car {
    public void run() {
        System.out.println("SUV is running...");
    }
    public void stop() {
        System.out.println("SUV is stopping...");
    }
    public void description() {
        System.out.println("This is a SUV.");
    }
}

最后,我们定义一个工厂类 CarFactory,通过传入车辆类型来创建不同的车型实例:

public class CarFactory {
    public static Car createCar(String type) {
        if (type.equals("SportsCar")) {
            return new SportsCar();
        } else if (type.equals("SUV")) {
            return new SUV();
        } else {
            return null;
        }
    }
}

使用简单工厂模式,客户端代码只需要传入不同类型的车辆类型,即可创建不同类型的车辆实例:

public class Client {
   public static void main(String[] args) {
      Car sportsCar = CarFactory.createCar("SportsCar");
      sportsCar.run();
      sportsCar.stop();
      sportsCar.description();

      Car suv = CarFactory.createCar("SUV");
      suv.run();
      suv.stop();
      suv.description();
   }
}

输出结果为:

Sports car is running...
Sports car is stopping...
This is a sports car.
SUV is running...
SUV is stopping...
This is a SUV.

抽象工厂模式

抽象工厂模式是工厂模式中最常用的一种形式,它通过一个抽象工厂和多个具体的工厂来实现对不同产品族的对象的创建。

示例:电器制造工厂

例如,一个电器制造工厂需要同时生产电视机、冰箱和空调等不同的产品。不同类型的电器都有不同的属性和方法。使用抽象工厂模式可以实现对不同类型的电器进行封装,便于代码的维护和扩展。

首先,我们定义一个接口类 TVRefrigeratorAirConditioner,其中包括了电器的基本属性和方法:

public interface TV {
    void powerOn();
    void powerOff();
}

public interface Refrigerator {
    void turnOn();
    void turnOff();
}

public interface AirConditioner {
    void start();
    void stop();
}

然后,我们定义不同产品族之间相互关联的产品实现类,如 HaierTVHaierRefrigeratorHaierAirConditionerTCLTVTCLRefrigeratorTCLAirConditioner

public class HaierTV implements TV {
    public void powerOn() {
        System.out.println("Haier TV is powered on.");
    }
    public void powerOff() {
        System.out.println("Haier TV is powered off.");
    }
}

public class HaierRefrigerator implements Refrigerator {
    public void turnOn() {
        System.out.println("Haier refrigerator is turned on.");
    }
    public void turnOff() {
        System.out.println("Haier refrigerator is turned off.");
    }
}

public class HaierAirConditioner implements AirConditioner {
    public void start() {
        System.out.println("Haier air conditioner is started.");
    }
    public void stop() {
        System.out.println("Haier air conditioner is stopped.");
    }
}

public class TCLTV implements TV {
    public void powerOn() {
        System.out.println("TCL TV is powered on.");
    }
    public void powerOff() {
        System.out.println("TCL TV is powered off.");
    }
}

public class TCLRefrigerator implements Refrigerator {
    public void turnOn() {
        System.out.println("TCL refrigerator is turned on.");
    }
    public void turnOff() {
        System.out.println("TCL refrigerator is turned off.");
    }
}

public class TCLAirConditioner implements AirConditioner {
    public void start() {
        System.out.println("TCL air conditioner is started.");
    }
    public void stop() {
        System.out.println("TCL air conditioner is stopped.");
    }
}

接着,我们定义一个抽象工厂 ApplianceFactory,其中定义了不同产品族之间的关联关系,如Haier工厂生产Haier电视机、Haier冰箱和Haier空调等:

public interface ApplianceFactory {
    TV createTV();
    Refrigerator createRefrigerator();
    AirConditioner createAirConditioner();
}

public class HaierApplianceFactory implements ApplianceFactory {
    public TV createTV() {
        return new HaierTV();
    }
    public Refrigerator createRefrigerator() {
        return new HaierRefrigerator();
    }
    public AirConditioner createAirConditioner() {
        return new HaierAirConditioner();
    }
}

public class TCLApplianceFactory implements ApplianceFactory {
    public TV createTV() {
        return new TCLTV();
    }
    public Refrigerator createRefrigerator() {
        return new TCLRefrigerator();
    }
    public AirConditioner createAirConditioner() {
        return new TCLAirConditioner();
    }
}

使用抽象工厂模式,客户端代码可以根据不同的工厂类型创建相应的对象,如创建Haier工厂生产的电器:

public class Client {
    public static void main(String[] args) {
        ApplianceFactory factory = new HaierApplianceFactory();
        TV tv = factory.createTV();
        tv.powerOn();
        tv.powerOff();
        Refrigerator refrigerator = factory.createRefrigerator();
        refrigerator.turnOn();
        refrigerator.turnOff();
        AirConditioner airConditioner = factory.createAirConditioner();
        airConditioner.start();
        airConditioner.stop();
    }
}

输出结果为:

Haier TV is powered on.
Haier TV is powered off.
Haier refrigerator is turned on.
Haier refrigerator is turned off.
Haier air conditioner is started.
Haier air conditioner is stopped.

总之,工厂模式可以极大地提高代码的可维护性、可扩展性和可复用性。它能帮助我们用较少的代码完成较多功能,并且在开发过程中也能更好地进行分层和组织代码。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java工厂模式优雅地创建对象以及提高代码复用率和灵活性 - Python技术站

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

相关文章

  • 常见的Java单元测试框架有哪些?

    常见的 Java 单元测试框架有 JUnit、TestNG、Spock 等。 JUnit JUnit 是一个 Java 单元测试框架,它是一个 Open Source 软件,遵循 Apache2.0 许可。JUnit 提供了一些注解和断言,可以使用它们编写测试代码。 示例说明 创建被测试类 public class Calculator { public i…

    Java 2023年5月11日
    00
  • Tomcat中更改网站根目录和默认页的配置方法

    好的。首先我们需要了解一下Tomcat的目录结构,以及默认的网站根目录和默认页。在Tomcat的目录下,有一个webapps目录,它是用来存放Web应用程序的。在该目录下新建一个名为myweb的文件夹,作为我们的示例Web应用程序。 下面就是具体的步骤: 1. 更改网站根目录 在Tomcat中,网站根目录的默认值是webapps目录下的根目录。我们可以通过更…

    Java 2023年6月2日
    00
  • Java 如何抛出自定义的异常?

    Java语言中,自定义异常可以通过继承Exception或者其子类RuntimeException实现。通过自定义异常,可以使得代码结构更加清晰,异常情况得到更加准确的处理。下面是Java如何抛出自定义异常的详细攻略。 继承Exception类实现自定义异常 首先,定义自定义异常类时,需要继承Exception类,如下所示: public class Cus…

    Java 2023年4月27日
    00
  • 黑客如何利用文件包含漏洞进行网站入侵

    黑客通过利用文件包含漏洞,可以轻松地将自己的代码注入到网站服务器中,从而实现对网站的入侵。下面是黑客会使用的一些攻击方法和技术: 使用文件包含漏洞的攻击方法 抓取页面源代码 黑客可以访问页面的URL,并使用一些指定的参数来获取页面的源代码。一旦黑客获取了页面的源代码,就可以查看其中是否存在文件包含漏洞。 判断漏洞类型 黑客可以通过分析页面源代码,判断该漏洞是…

    Java 2023年6月15日
    00
  • SpringMVC 传日期参数到后台的实例讲解

    在 Spring MVC 中,我们可以使用多种方式来传递日期参数到后台,包括使用 @DateTimeFormat 注解、使用 Converter 接口、使用 Formatter 接口等。本文将详细讲解 Spring MVC 如何传递日期参数到后台,包括如何使用 @DateTimeFormat 注解、使用 Converter 接口、使用 Formatter 接…

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

    Java实现图书借阅系统的完整攻略 介绍 本文将介绍如何使用Java编程语言实现简单的图书借阅系统。该系统包括了书籍的添加、删除和查询功能,以及具有借阅和归还功能的用户界面。 开发环境 本文将使用Java编程语言进行开发。Java具有强大的面向对象编程特性,并且易于学习和使用。我们将使用Java的标准库和一些第三方库来实现该系统。 具体的开发环境和所使用的库…

    Java 2023年5月19日
    00
  • Java中Lambda表达式用法介绍

    Java中Lambda表达式用法介绍 Lambda表达式简介 Lambda表达式是Java8中引入的一种新的语法特性,简化了匿名函数的实现方式。使用Lambda表达式语法可以使代码更加简洁、易读。Lambda表达式是一个匿名函数,它没有名称、修饰符以及返回类型。Lambda表达式的主要功能是用来定义匿名内部类的实例。 Lambda表达式适用于函数式接口,函数…

    Java 2023年5月26日
    00
  • Java实现Excel导入导出数据库的方法示例

    下面是Java实现Excel导入导出数据库的方法示例的完整攻略: 一、Excel导入数据库: 首先,需要添加相关的依赖包,如以下示例代码所示: <!– poi组件 –> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi&…

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