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日

相关文章

  • Spring Security OAuth 个性化token的使用

    下面我来详细讲解“Spring Security OAuth 个性化token的使用”。 什么是Spring Security OAuth Spring Security OAuth 是 Spring Security 的子项目,它是一个支持多种 OAuth2 协议的授权框架。它提供了一些 API 和注解,方便我们进行 OAuth2 认证和授权的开发。 个性…

    Java 2023年5月20日
    00
  • java使用nio2拷贝文件的示例

    下面是Java使用NIO2拷贝文件的完整攻略,包含了两条示例。 Java NIO2简介 Java NIO2是Java 7版本中新增的一组I/O API,它提供了一种更快、更灵活、更可扩展的I/O操作方式。相较于Java I/O包,NIO2提供了异步非阻塞I/O操作、可感知文件系统积分和大文件操作等特性,这使得开发人员可以更好地处理高并发、高吞吐的I/O场景。…

    Java 2023年5月19日
    00
  • Spring Boot + Kotlin整合MyBatis的方法教程

    接下来我将详细讲解“Spring Boot + Kotlin整合MyBatis的方法教程”的完整攻略,过程中包含两条示例说明。 1. 环境准备 在开始整合之前,我们需要先准备好以下环境: JDK 1.8+ Kotlin 1.3+ Spring Boot 2.0+ MyBatis 3.4+ 2. 添加依赖 在开始整合之前,我们需要先在 build.gradle…

    Java 2023年6月1日
    00
  • JSP连接SQL Server 2000系统配置

    JSP连接SQL Server 2000需要进行以下步骤: 环境准备 安装JDBC驱动:在JSP项目中引入SQL Server JDBC驱动包,通常是一个jar文件。可以从官方网站下载(https://docs.microsoft.com/zh-cn/sql/connect/jdbc/download-microsoft-jdbc-driver-for-sq…

    Java 2023年6月15日
    00
  • java控制台实现聊天程序

    要实现Java控制台的聊天程序,需要用到Socket编程以及多线程编程。 以下为实现步骤: 步骤一:建立连接 在客户端和服务端之间建立连接需要使用Socket编程。在客户端中创建一个Socket对象,指定连接的IP地址和端口号,然后发送连接请求。在服务端中创建一个ServerSocket对象,并指定端口号,然后等待客户端的连接请求,如果有客户端请求连接,则建…

    Java 2023年5月24日
    00
  • 启用springboot security后登录web页面需要用户名和密码的解决方法

    下面是启用Spring Boot Security后登录Web页面需要用户名和密码的解决方法的完整攻略,包括以下步骤: 1. 添加Spring Boot Security依赖 在pom.xml文件中添加Spring Boot Security依赖: <dependency> <groupId>org.springframework.b…

    Java 2023年6月3日
    00
  • 什么是死锁?

    以下是关于死锁的完整使用攻略: 什么是死锁? 死锁是指两个或多个线程在执行过程中,因互相等待对方释放资源而陷入的一种僵局。在死锁状态下,每个线程都在等待其他线程释放资源,从而导致线程都无法继续执行下去。锁是多线程编程中的一种常见问题,如果不加以处理,可能会导致程序崩溃。 死锁的原因 死锁的原因主要有两个方面: 竞争资源:当多个线程竞争同资源时可能会导致死锁。…

    Java 2023年5月12日
    00
  • java中判断字段真实长度的实例(中文2个字符,英文1个字符)

    下面我将详细讲解如何在Java中判断字段真实长度,区分中文和英文字符长度的处理方式。 问题背景 在开发Web应用程序时,经常需要对表单输入的数据进行长度验证,例如用户名、密码、手机、邮箱等,但是不同的语言字符所占用的字节数是不同的,在判断字符长度时,如果不做特别处理,就会出现问题。 在Java中可以使用字符编码的方式来解决这个问题。 解决方案 1、使用Str…

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