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

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日

相关文章

  • golang进程内存控制避免docker内oom

    Golang进程内存控制避免Docker内OOM攻略 在使用Golang编写应用程序并在Docker容器中运行时,可能会遇到内存不足的问题,导致容器被系统强制终止(OOM)。为了避免这种情况,我们可以采取一些措施来控制Golang进程的内存使用。 1. 使用runtime.MemStats包 Golang的runtime包提供了MemStats结构体,可以用…

    other 2023年8月2日
    00
  • 无线wifi的13个信道频率范围

    无线wifi的13个信道频率范围 在无线WiFi的使用过程中,我们往往需要选择一个可用的信道来保证无线网络的正常运行,但是对于不了解无线网络技术的用户来说,信道的选择可能会比较困难。在本文中,我们将介绍WiFi的13个信道频率范围,帮助用户选择合适的信道。 什么是无线WiFi信道 首先,我们需要了解WiFi信道的概念。在无线网络中,WiFi信道代表着无线网络…

    其他 2023年3月28日
    00
  • SpringBoot整合阿里云视频点播的过程详解

    下面是详细的Spring Boot整合阿里云视频点播的过程详解。 1. 创建阿里云账号并开通视频点播服务 首先需要创建一对阿里云的AccessKey ID和AccessKey Secret,以获取访问阿里云视频点播的权限。此外,还需要开通视频点播服务,获取点播服务的API地址。 2. 引入阿里云视频点播的SDK 在Spring Boot项目的pom.xml文…

    other 2023年6月27日
    00
  • localdate/localdatetime与string的互相转换示例(附…

    localdate/localdatetime与string的互相转换示例(附代码) 在Java中,有很多日期时间相关的类型,例如LocalDate、LocalDateTime、Date等等。在实际开发中我们会面临将这些类型转换为String的需求,或者将String类型的日期时间转换为这些类型。本文将介绍如何使用Java 8的新日期时间API和Simple…

    其他 2023年3月28日
    00
  • 如何下载旧版本的mysql

    如果您需要下载旧版本的MySQL,可以按照以下步骤进行操作。以下是如何下载旧版本的MySQL的完整攻略,包含两个示例说明。 步骤一:访问MySQL官方网站 访问MySQL官方网站(https://dev.mysql.com/downloads/mysql/)。 步骤二:选择要下载的MySQL版本 在MySQL官方网站上,可以找到所有可用的MySQL版本。选择…

    other 2023年5月9日
    00
  • 详解Vue项目部署遇到的问题及解决方案

    下面是详解Vue项目部署遇到的问题及解决方案的完整攻略。 问题描述 在部署Vue项目时,我们可能会遭遇以下一些问题: Vue项目打包后的文件体积过大,导致加载时间过长。 部署后,页面出现“404 Not Found”错误。 部署到服务器后,项目运行缓慢,或者界面显示异常等问题。 其他一些与部署相关的问题。 \n 解决方案 问题一:Vue项目打包后的文件体积过…

    other 2023年6月27日
    00
  • idea64.exe.vmoptions文件如何设置调整VM配置文件

    关于如何设置调整idea64.exe.vmoptions文件的VM配置,可以按照以下步骤进行: 步骤1:打开Intellij IDEA软件,点击菜单栏中的“Help”选项,再选择“Edit Custom VM Options…”选项 步骤2:此时系统会默认打开idea64.exe.vmoptions文件,该文件中记录了Intellij IDEA的JVM配…

    other 2023年6月25日
    00
  • 判断字段是否被更新 新旧数据写入Audit Log表中

    要判断一个字段是否被更新,可以对比旧数据和新数据,如果这个字段在旧数据和新数据中的值不相同,那么就说明这个字段被更新了。一般来说,我们可以通过数据库中的触发器来完成这一操作。具体步骤如下: 首先创建一个Audit Log表用于记录更新日志,它至少应该包含以下几个字段: id:自增主键,用于标识每条更新记录的唯一性 table_name:被更新的表名 fiel…

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