Java设计模式之工厂模式(Factory模式)介绍

Java设计模式之工厂模式(Factory模式)介绍

什么是工厂模式?

工厂模式是一种常用的面向对象设计模式。它提供了一种创建对象的最佳方式,而无需将对象的创建细节暴露给客户端。

工厂模式通过通过一个工厂方法来创建对象。这个方法通常被声明在工厂接口或抽象类中,具体子类实现这个方法来创建具体的对象。

工厂模式可以在程序中很方便地修改对象的创建方式。

工厂模式的类型

  1. 简单工厂模式(Simple Factory Pattern)

简单工厂模式包含一个工厂类和多个具体产品类。工厂类的创建方法中通过多重判断语句(if/else或switch),来动态地创建所需要的产品类的实例。

示例:一个计算器工厂类,可以根据传入参数创建不同的计算器实例(加法、减法等)。

  1. 工厂方法模式(Factory Method Pattern)

工厂方法模式是对简单工厂模式的优化,它将工厂类抽象化,让具体实现交由其子类完成。

示例:一个披萨工厂,可以根据口味返回不同类型的披萨实例(比萨、培根比萨等)。

  1. 抽象工厂模式(Abstract Factory Pattern)

抽象工厂模式用于创建一系列产品族,这些产品都有共同的主题。

示例:一个家电工厂,可以分别生产电视机、空调、洗衣机等不同的家电系列。

工厂模式的优缺点

优点

  1. 将产品的具体实现与创建过程分离,客户端无需关注创建过程,只需调用工厂方法即可。

  2. 工厂类可以根据需要决定创建哪种产品实例,客户端则无需知道具体实现过程。

  3. 可以轻松扩展新的产品实现,只需添加具体的产品类和对应的工厂方法即可。

缺点

  1. 增加了系统的抽象度和复杂度。

  2. 需要额外的代码实现工厂类和对应的产品类。

工厂模式的应用场景

  1. 当类中有大量重复的代码时,可以考虑使用工厂方法来消除重复代码。

  2. 当需要创建一个不知道具体类型的对象时,可以使用工厂方法来创建。

  3. 当希望将产品的实现与创建过程分离,使得客户端无需关注创建过程时,可以使用工厂方法。

简单工厂模式示例

// 抽象产品类
public abstract class Computer {
    public abstract void display();
}

// 具体产品类
public class HPComputer extends Computer {
    @Override
    public void display() {
        System.out.println("This is an HP computer.");
    }
}

// 具体产品类
public class DellComputer extends Computer {
    @Override
    public void display() {
        System.out.println("This is a Dell computer.");
    }
}

// 简单工厂类
public class ComputerFactory {
    public static Computer createComputer(String type) {
        switch (type) {
            case "HP":
                return new HPComputer();
            case "Dell":
                return new DellComputer();
            default:
                return null;
        }
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        Computer hp = ComputerFactory.createComputer("HP");
        hp.display();
        Computer dell = ComputerFactory.createComputer("Dell");
        dell.display();
    }
}

工厂方法模式示例

// 抽象产品类
public abstract class Pizza {
    public abstract void prepare();
    public abstract void bake();
    public abstract void cut();
    public abstract void box();
}

// 具体产品类
public class CheesePizza extends Pizza {
    @Override
    public void prepare() {
        System.out.println("Preparing cheese pizza.");
    }

    @Override
    public void bake() {
        System.out.println("Baking cheese pizza.");
    }

    @Override
    public void cut() {
        System.out.println("Cutting cheese pizza.");
    }

    @Override
    public void box() {
        System.out.println("Packing cheese pizza.");
    }
}

// 具体产品类
public class PepperoniPizza extends Pizza {
    @Override
    public void prepare() {
        System.out.println("Preparing pepperoni pizza.");
    }

    @Override
    public void bake() {
        System.out.println("Baking pepperoni pizza.");
    }

    @Override
    public void cut() {
        System.out.println("Cutting pepperoni pizza.");
    }

    @Override
    public void box() {
        System.out.println("Packing pepperoni pizza.");
    }
}

// 抽象工厂类
public abstract class PizzaFactory {
    public abstract Pizza createPizza(String type);
}

// 具体工厂类
public class NewYorkPizzaFactory extends PizzaFactory {
    public Pizza createPizza(String type) {
        switch(type) {
            case "Cheese":
                return new CheesePizza();
            case "Pepperoni":
                return new PepperoniPizza();
            default:
                return null;
        }
    }
}

// 具体工厂类
public class ChicagoPizzaFactory extends PizzaFactory {
    public Pizza createPizza(String type) {
        switch(type) {
            case "Cheese":
                return new CheesePizza();
            case "Pepperoni":
                return new PepperoniPizza();
            default:
                return null;
        }
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        PizzaFactory nyFactory = new NewYorkPizzaFactory();
        Pizza cheesePizza = nyFactory.createPizza("Cheese");
        cheesePizza.prepare();
        cheesePizza.bake();
        cheesePizza.cut();
        cheesePizza.box();

        PizzaFactory chicagoFactory = new ChicagoPizzaFactory();
        Pizza pepperoniPizza = chicagoFactory.createPizza("Pepperoni");
        pepperoniPizza.prepare();
        pepperoniPizza.bake();
        pepperoniPizza.cut();
        pepperoniPizza.box();
    }
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java设计模式之工厂模式(Factory模式)介绍 - Python技术站

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

相关文章

  • JavaEE微框架Spring Boot深入解读

    JavaEE微框架SpringBoot深入解读 简介 Spring Boot是一个基于Spring框架的快速应用开发框架,它简化了Spring应用的开发过程,使用起来非常方便,而且能够快速地搭建一个可用的、生产级别的应用程序。 Spring Boot的核心特性 自动配置 在Spring Boot的自动配置下,开发者不需要再手动地为每一个框架、类库引入一个配置…

    Java 2023年5月15日
    00
  • JavaWEB中Servlet的生命周期详解

    JavaWEB中Servlet的生命周期详解 Servlet是JavaEE中常用的组件之一,它的生命周期与Web应用程序的生命周期吻合。在这篇文章中,我们将深入了解Servlet的生命周期以及其中的每个部分。 Servlet的生命周期 Servlet的生命周期可以分为三个部分:初始化、服务和销毁。 初始化 在Servlet第一次被创建时,web容器会调用其i…

    Java 2023年5月30日
    00
  • JSP实时显示当前系统时间的四种方式示例解析

    我将从以下几个方面进行详细讲解“JSP实时显示当前系统时间的四种方式示例解析”的完整攻略: 确定需求 方式一:使用JSP内置对象实现实时显示系统时间 方式二:使用JavaScript实现实时显示系统时间 方式三:使用Java代码实现实时显示系统时间 方式四:使用AJAX定时刷新实现实时显示系统时间 总结 1. 确定需求 在开始实现之前,我们需要明确实现的目标…

    Java 2023年5月20日
    00
  • SpringMVC+Spring+Mybatis实现支付宝支付功能的示例代码

    这里是“SpringMVC+Spring+Mybatis实现支付宝支付功能”的完整攻略,包含示例代码。读者可以根据这个攻略来实现他们自己的支付宝支付功能。 概述 在这个攻略中,我们将使用SpringMVC、Spring和Mybatis框架,来实现一个支付宝支付功能的示例。我们会使用支付宝提供的SDK来操作支付宝的API接口。这个示例中会包括以下几个步骤: 在…

    Java 2023年6月15日
    00
  • Java Maven构建工具中mvnd和Gradle谁更快

    本文主要分析Java Maven构建工具中mvnd和Gradle谁更快,内容包括mvnd和Gradle的特点、使用、优缺点以及比较测试。 Maven构建工具简介 Apache Maven是一个流行的Java构建工具,用于管理项目构建,依赖和文档。Maven基于Project Object Model(POM)来定义项目的操作,以及声明项目的依赖项和构建配置。…

    Java 2023年6月2日
    00
  • Node.js在图片模板上生成二维码图片并附带底部文字说明实现详解

    下面是关于“Node.js在图片模板上生成二维码图片并附带底部文字说明实现详解”的完整攻略: 1. 确认需求和准备工作 首先,我们需要明确需求:将一个指定的网址生成二维码图片,并将其和输入的底部文字添加到一个给定的模板图片上,最终生成一张包含二维码和底部文字的图片。 在开始实现之前,我们需要做一些准备工作: 安装 Node.js 和相关依赖; 准备好模板图片…

    Java 2023年5月30日
    00
  • SpringBoot YAML语法基础详细整理

    YAML是一种轻量级的数据序列化格式,常用于配置文件中。Spring Boot支持使用YAML格式的配置文件,以下是Spring Boot YAML语法基础的详细整理: 1. 基本语法 1.1 键值对 使用冒号(:)表示键值对,键和值之间用空格隔开。 key: value 1.2 列表 使用短横线(-)表示列表,每个元素占一行。 – item1 – item…

    Java 2023年5月14日
    00
  • commons fileupload实现文件上传的实例代码

    当我们需要在Web应用程序中实现文件上传功能时,可以使用Apache Commons FileUpload库来实现这个功能。下面将详细讲解如何使用该库来实现文件上传功能,包括添加依赖、编写实现代码等过程。 添加依赖 首先,在Maven项目中添加以下依赖项: <dependency> <groupId>commons-fileuploa…

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