java设计模式–三种工厂模式详解

yizhihongxing

Java 设计模式:三种工厂模式详解

工厂模式是Java中常见的一种设计模式,用来解决对象创建过程中的一些问题。根据具体的需求和使用场景,工厂模式还可以进一步细分为三种——简单工厂模式、工厂方法模式和抽象工厂模式。

本文将详细讲解三种工厂模式的原理、特点、适用场景以及代码实现等方面的内容,希望对Java初学者有所帮助。

简单工厂模式

原理

在简单工厂模式中,创建对象的工作由工厂类来完成,客户端只需要给出需要创建对象的类型,工厂类就可以根据类型进行创建。因此,简单工厂模式将对象的创建和使用分离开来,降低了客户端与具体对象之间的耦合度。

特点

  • 客户端只需要知道所需产品的名称即可,无需了解具体的实现。
  • 工厂类负责对象的创建和管理。
  • 简单工厂模式适用于工厂类负责业务较少,对象简单创建流程且客户端只需要知道产品名称的情况下。

适用场景

  • 希望封装对象创建的细节,降低耦合度。
  • 当一个类有很多子类,而客户端需要根据条件来选择其中一种时,可以考虑简单工厂模式。
  • 当客户端只知道传入的参数,而不知道具体要创建的对象时,可以使用简单工厂模式。

示例

比如在网站注册的过程中,需要获取用户类型并创建对应的用户对象。我们可以使用简单工厂模式来创建这些用户对象。

/**
 * 用户类
 */
public abstract class User {
    public abstract void show();
}

/**
 * 普通用户
 */
public class NormalUser extends User {
    @Override
    public void show() {
        System.out.println("我是普通用户");
    }
}

/**
 * VIP用户
 */
public class VipUser extends User {
    @Override
    public void show() {
        System.out.println("我是VIP用户");
    }
}

/**
 * 用户工厂类
 */
public class UserFactory {
    public static User createUser(String userType) {
        if ("normalUser".equals(userType)) {
            return new NormalUser();
        } else if ("vipUser".equals(userType)) {
            return new VipUser();
        } else {
            throw new RuntimeException("unsupported user type");
        }
    }
}

/**
 * 客户端代码
 */
public class Client {
    public static void main(String[] args) {
        User normalUser = UserFactory.createUser("normalUser");
        normalUser.show();

        User vipUser = UserFactory.createUser("vipUser");
        vipUser.show();
    }
}

输出结果:

我是普通用户
我是VIP用户

工厂方法模式

原理

工厂方法模式是在简单工厂模式的基础上进一步发展而来的一种模式,每个具体产品对应一个具体的工厂类,将工厂类的创建过程也进行了解耦。客户端只需要根据需要的具体产品对应的具体工厂类来进行实例化操作。

特点

  • 将对象的创建和使用分离开来,降低了客户端和具体产品的耦合度。
  • 每个具体产品都对应一个具体的工厂类,扩展性高。

适用场景

  • 当对象复杂创建流程,需要多个工厂类进行配合创建时,可以使用工厂方法模式。
  • 当客户端只需要知道要创建的产品即可,不需要知道具体的实现时,可以考虑使用工厂方法模式。

示例

比如在网站中,有多个用户类型需要创建,我们可以使用工厂方法模式来创建这些用户类型的对象。

/**
 * 用户类
 */
public abstract class User {
    public abstract void show();
}

/**
 * 普通用户
 */
public class NormalUser extends User {
    @Override
    public void show() {
        System.out.println("我是普通用户");
    }
}

/**
 * VIP用户
 */
public class VipUser extends User {
    @Override
    public void show() {
        System.out.println("我是VIP用户");
    }
}

/**
 * 用户工厂接口
 */
public interface UserFactory {
    User createUser();
}

/**
 * 普通用户工厂
 */
public class NormalUserFactory implements UserFactory {
    @Override
    public User createUser() {
        return new NormalUser();
    }
}

/**
 * VIP用户工厂
 */
public class VipUserFactory implements UserFactory {
    @Override
    public User createUser() {
        return new VipUser();
    }
}

/**
 * 客户端代码
 */
public class Client {
    public static void main(String[] args) {
        UserFactory normalUserFactory = new NormalUserFactory();
        User normalUser = normalUserFactory.createUser();
        normalUser.show();

        UserFactory vipUserFactory = new VipUserFactory();
        User vipUser = vipUserFactory.createUser();
        vipUser.show();
    }
}

输出结果:

我是普通用户
我是VIP用户

抽象工厂模式

原理

抽象工厂模式提供了一个接口用来创建一系列相关或相互依赖的对象,而不需要指定它们的具体类。抽象工厂模式同样可以通过工厂方法模式来对工厂进行抽象,最终达到创建对象和使用对象相分离的目的。

特点

  • 可以创建一系列相关的产品对象。
  • 具备良好的扩展性,当需要新增产品对象时,只需要添加一个工厂类即可。

适用场景

  • 当有多个系列产品需要创建时,可以使用抽象工厂模式。
  • 当需要各个系列产品进行组合时,可以考虑使用抽象工厂模式。

示例

在一个网站中,有多个系列的用户和订单需要创建,我们可以使用抽象工厂模式来进行创建。

/**
 * 用户类
 */
public abstract class User {
    public abstract void show();
}

/**
 * 订单类
 */
public abstract class Order {
    public abstract void show();
}

/**
 * 普通用户
 */
public class NormalUser extends User {
    @Override
    public void show() {
        System.out.println("我是普通用户");
    }
}

/**
 * VIP用户
 */
public class VipUser extends User {
    @Override
    public void show() {
        System.out.println("我是VIP用户");
    }
}

/**
 * 普通订单
 */
public class NormalOrder extends Order {
    @Override
    public void show() {
        System.out.println("我是普通订单");
    }
}

/**
 * VIP订单
 */
public class VipOrder extends Order {
    @Override
    public void show() {
        System.out.println("我是VIP订单");
    }
}

/**
 * 抽象工厂接口
 */
public interface Factory {
    User createUser();
    Order createOrder();
}

/**
 * 普通用户工厂
 */
public class NormalFactory implements Factory {
    @Override
    public User createUser() {
        return new NormalUser();
    }

    @Override
    public Order createOrder() {
        return new NormalOrder();
    }
}

/**
 * VIP用户工厂
 */
public class VipFactory implements Factory {
    @Override
    public User createUser() {
        return new VipUser();
    }

    @Override
    public Order createOrder() {
        return new VipOrder();
    }
}

/**
 * 客户端代码
 */
public class Client {
    public static void main(String[] args) {
        Factory normalFactory = new NormalFactory();
        User normalUser = normalFactory.createUser();
        normalUser.show();
        Order normalOrder = normalFactory.createOrder();
        normalOrder.show();

        Factory vipFactory = new VipFactory();
        User vipUser = vipFactory.createUser();
        vipUser.show();
        Order vipOrder = vipFactory.createOrder();
        vipOrder.show();
    }
}

输出结果:

我是普通用户
我是普通订单
我是VIP用户
我是VIP订单

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java设计模式–三种工厂模式详解 - Python技术站

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

相关文章

  • spring使用RedisTemplate操作Redis数据库

    下面是详细讲解Spring框架中如何使用RedisTemplate操作Redis数据库的完整攻略。 使用RedisTemplate 简介 Redis是一种内存数据存储,通常用于缓存和会话管理。Spring框架提供了一个Redis模块,其中包含了一个叫做RedisTemplate的类,用于操作Redis数据库。RedisTemplate可以让开发者使用简单的J…

    other 2023年6月27日
    00
  • Java 数据结构进阶二叉树题集下

    Java 数据结构进阶二叉树题集下攻略 本文将分享 Java 数据结构进阶二叉树题集下的完整攻略,希望能对读者有所帮助。本文具体展示的是如何使用 Java 实现二叉树的相关算法。 1. 二叉树的创建 二叉树的创建有多种方式,本文以手工创建的方式为例。代码如下: class Node { Node left; Node right; int value; pu…

    other 2023年6月27日
    00
  • nginx常用内置变量

    以下是关于“nginx常用内置变量”的完整攻略,包括基本概念、常用内置变量、示例说明和注意事项。 基本概念 Nginx是一款高性能的Web服务器和反向代理服务器,常用于构建高并发、高可用的Web应用。在Nginx中,内置变量是一种特殊的变量,可以在配置文件中使用,用于获取请求的相关信息。 常用内置变量 以下是Nginx中常用的内置变量: $request_u…

    other 2023年5月7日
    00
  • 微软开始在 Win11 上测试 Win10 经典右键菜单的新型设计,更加干净整洁

    下面是关于“微软开始在 Win11 上测试 Win10 经典右键菜单的新型设计,更加干净整洁”的详细讲解攻略。 什么是 Win10 经典右键菜单? Win10 经典右键菜单是指现在 Win10 操作系统上默认显示的鼠标右键菜单,它包含了大量的子菜单和选项,界面看上去比较复杂,而且并不是每个选项都是用户常用的。所以有一些用户可能会希望有一种更加简洁、整洁的右键…

    other 2023年6月27日
    00
  • linux系统:swap内存使用率过高解决办法

    以下是关于“Linux系统:swap内存使用率过高解决办法”的完整攻略,包括基本概念、原因分析、解决办法和两个示例。 基本概念 Linux系统中,swap是一种虚拟内存技术,用于在物理内存不足时将部分内存数据存储到硬盘。系统需要访问被存储在swap中的数据时,会将其从硬盘中读取到内存中。swap内存使用率过高可能会导致系统性能下降。 原因分析 swap内存使…

    other 2023年5月7日
    00
  • mysql 5.7更改数据库的数据存储位置的解决方法

    下面是“mysql 5.7更改数据库的数据存储位置的解决方法”的完整攻略。 问题描述 在默认情况下,MySQL 5.7 将数据存储在以下位置:/var/lib/mysql。但是有时候,你可能需要将数据存储在其他地方,例如你的磁盘空间不足,或者你希望将数据备份到外部硬盘上。 解决方法 下面是更改MySQL 5.7 数据库存储位置的两种方法: 方法一:通过修改配…

    other 2023年6月27日
    00
  • vue使用Swiper踩坑解决避坑

    Vue使用Swiper踩坑解决避坑攻略 1. 安装Swiper 首先,我们需要安装Swiper库。在Vue项目的根目录下,打开终端,运行以下命令安装Swiper: npm install swiper –save 2. 导入Swiper 在需要使用Swiper的组件中,导入Swiper库。在Vue项目中,一般在<script>标签中使用impo…

    other 2023年6月28日
    00
  • 使用logback屏蔽一些包的日志

    以下是使用logback屏蔽一些包的日志的完整攻略: 首先,在项目的classpath下创建logback.xml文件,用于配置logback的日志输出规则。 在logback.xml文件中,使用<logger>标签配置需要屏蔽日志的包名,并设置其日志级别为OFF。 示例1:屏蔽com.example.package包的日志 xml <lo…

    other 2023年10月14日
    00
合作推广
合作推广
分享本页
返回顶部