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日

相关文章

  • 这一次搞懂Spring的Bean实例化原理操作

    这一次搞懂Spring的Bean实例化原理操作 简介 在Spring中,Bean是个非常核心且重要的概念,了解Bean的实例化原理对于我们理解Spring框架的工作原理至关重要。本文将详细讲解Spring的Bean实例化过程及其相关细节。 Bean实例化原理 在Spring中,Bean的实例化主要分为以下两个步骤: 定位Bean定义文件并读取Bean定义信息…

    Java 2023年5月26日
    00
  • Java字节码插装的作用是什么?

    Java字节码插装是指在程序运行期间通过修改Java程序的字节码来达到修改程序行为和进行调试的目的。常见的字节码插装技术有Java Agent和AspectJ。 Java字节码插装的作用主要分为以下两个方面: 类加载时期修改类的字节码,在程序运行时对其进行增强 在程序运行时,通过对方法的字节码进行修改,实现将自己的代码嵌入到目标方法的中间或结尾位置 常见的应…

    Java 2023年5月11日
    00
  • 记一次jedis连接池顽固问题排查与修改

    这辈子不想再看到jedisBrokenPipe!!   测试环境运行16天后报错信息: 05:42:32.629 [http-nio-8093-exec-2] ERROR o.a.c.c.C.[.[.[.[dispatcherServlet] – [log,175] – Servlet.service() for servlet [dispatcherSer…

    Java 2023年4月22日
    00
  • java如何完成输出语句实例详解

    下面是Java如何完成输出语句的攻略: 1. 输出语句的基本格式 Java中的输出语句使用System.out.print()和System.out.println(),其中print()可以输出字符串,并且不换行,println()则会在输出后换行。 下面是输出字符串的基本格式: System.out.print("Hello World&quo…

    Java 2023年5月23日
    00
  • SpringBoot配置使用H2数据库的简单教程

    下面是关于”SpringBoot配置使用H2数据库的简单教程”的完整攻略,包含有两条示例: 目录 环境要求 新建SpringBoot项目 配置H2数据库 使用H2数据库 方法一:使用浏览器访问H2数据库 方法二:使用SQL客户端访问H2数据库 环境要求 Java 8 Maven 3 SpringBoot 新建SpringBoot项目 首先我们需要新建一个Sp…

    Java 2023年6月1日
    00
  • Java对Excel表格的上传和下载处理方法

    Java可以使用Apache POI库来实现Excel表格的上传和下载处理。具体的处理方法可以分为三个步骤:导入POI库,读取Excel文件,写入Excel文件。下面我们就详细介绍这三个步骤。 1. 导入POI库 首先需要将POI库导入到Java项目中,可以通过Maven等方式引入POI库。在Maven中,引入POI库的方法如下: <!–Apache…

    Java 2023年5月19日
    00
  • Java之maven打完jar包之后将jar包放到指定位置汇总

    下面是“Java之maven打完jar包之后将jar包放到指定位置汇总”的完整攻略: 一、使用Maven打jar包 在项目的pom.xml文件中添加以下配置: <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId>…

    Java 2023年5月19日
    00
  • Java8语法糖之Lambda表达式的深入讲解

    Java8语法糖之Lambda表达式的深入讲解 什么是Lambda表达式 Lambda表达式是Java8引入的一种新特性,它是一种匿名函数,可以用来简洁地表示某种行为,简化代码的编写。 Lambda表达式通常由参数列表、箭头符号和函数体组成。参数列表指定了传入该Lambda表达式的变量;箭头符号表示Lambda表达式的执行方向;函数体包含了Lambda表达式…

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