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中throws实例用法详解

    Java中throws实例用法详解 什么是异常? 在编写 Java 代码的过程中,我们有时候会遇到一些错误,例如访问一个不存在的文件,访问 null 对象,或者调用方法时传入了非法参数等。这些错误被称为异常。 异常在运行时被抛出,程序会尝试去处理这个异常,如果未能处理,则会导致程序中断。Java 中的异常继承自 Java.lang.Throwable 类。 …

    Java 2023年5月27日
    00
  • 关于Java集合框架面试题(含答案)上

    关于Java集合框架面试题(含答案)上 为什么需要学习Java集合? 在Java编程中,集合是非常常见的一种数据结构,几乎每个Java程序员都必须掌握Java集合框架。Java集合包含了许多不同种类的集合类,例如ArrayList、LinkedList、HashSet、TreeSet、HashMap等等。这些集合类处理复杂数据结构时非常有用,因此掌握Java…

    Java 2023年5月26日
    00
  • 一文精通Java 多线程之全方位解读

    “一文精通Java 多线程之全方位解读”是一篇介绍Java多线程知识的文章,介绍了Java多线程的基础知识、线程的生命周期、多线程并发问题、锁机制、线程池等内容。 下面是详细的攻略: 基础知识 在多线程编程之前我们首先需要了解Java多线程的相关概念,例如进程、线程、线程状态、上下文切换等。文章首先详细讲解了这些基础知识,让读者对Java多线程编程有一个整体…

    Java 2023年5月19日
    00
  • java编程数据类型全面详解教程新手必入

    Java编程数据类型全面详解教程新手必入攻略 本文将为Java新手提供全面详细的Java数据类型教程,包括数据类型的定义、分类、使用方法等内容,帮助新手快速入门Java编程。 数据类型是什么? 数据类型是计算机语言中用来表示数据分类的一种分类方式。在Java编程中,数据类型用来声明变量的类型,以便编译器能够对变量进行正确处理。 Java数据类型分类 Java…

    Java 2023年5月23日
    00
  • Java面试岗常见问题之ArrayList和LinkedList的区别

    下面是如何回答“Java面试岗常见问题之ArrayList和LinkedList的区别”的完整攻略。 问题背景 Java面试中经常会出现有关集合类的问题,尤其是ArrayList和LinkedList。这两个集合类是Java中常见的列表实现,虽然他们都实现了List接口,但是在使用中有很多区别。下面就是有关ArrayList和LinkedList的区别问题的…

    Java 2023年5月26日
    00
  • Spring实现文件上传(示例代码)

    添加依赖 进行文件上传需要添加相关依赖,包括spring-webmvc、spring-context和commons-fileupload。 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</art…

    Java 2023年6月15日
    00
  • JAVA实现301永久重定向方法

    Java实现301永久重定向的方法需要在服务器端进行配置。下面是具体的步骤: 1. 配置web.xml文件 在web.xml文件中添加以下代码,该代码将对匹配的URL进行永久重定向 <web-app> <error-page> <error-code>301</error-code> <location&…

    Java 2023年6月15日
    00
  • Java计算字符串公式的方式解读

    下面是Java计算字符串公式的方式解读: 1. 了解逆波兰表达式 在计算字符串公式之前,需要了解逆波兰表达式。逆波兰表达式是一种将数学表达式中的运算符放在操作数的后面进行计算的形式。 例如,中缀表达式(即常见的数学公式)5 + 3 * 2 – 6可以转换为逆波兰表达式:5 3 2 * + 6 – 在逆波兰表达式中,操作数在前面,运算符在后面,便于计算时进行栈…

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