浅谈工厂模式

简介: 本文描述设计模式重点的工厂模式

工厂模式是一种设计模式,它允许您在不向客户端公开实例化逻辑的情况下创建对象。

它是一种将对象的实例化委托给工厂类的方法,而客户端无需决定要实例化的具体类。

让我们来看看一些术语:

  • 客户端:需要对象的类。
  • 工厂:创建对象的类。
  • 决定参数:工厂类用来决定实例化哪个具体类的参数。
  • 抽象:当客户端获得一个对象时,它希望它做一些事情。它需要知道它需要哪些类型的对象。

举个例子

你在滴滴上叫一辆车,在订单还没有被接单时,你并不知道来接你的是什么车,只有等到正式有人接单了,你才知道你乘坐的车的具体信息。

把上述场景和工厂模式进行对比,

你是客户端;

滴滴是工厂,他会给你派一辆车,来接你;

时间和地理位置是滴滴决定给你派什么车的依据;

而汽车是抽象概念。你确定你需要一辆车,而且会得到一辆车。

具体实现

接下来我们看看如何实现上述实例:

创建一个Car接口,然后给他一个基本方法,比如说

// Car interface
public interface Car {
    public void showCarInfo();
}

// its implementations
public class BMW implements Car {
    public void showCarInfo() {
        System.out.println("The car brand is BMW");
    }
}

// 二手奥拓
public class SecondHandAuto implements Car {
    public void showCarInfo() {
        System.out.println("The car brand is SecondHandAuto");
    }
}

Car也可以是一个抽象类,以便为所有汽车提供一些通用功能。它还可以有更多的方法。为了简单起见,我们只显示汽车品牌。

工厂类

接下来我们创建一个工厂类

public class CarFactory {
    public static Car getCar(String location, String time) {
        if (location.equals("Beijing TianAnMen") && time.equals("morning")) {
            return new BMW();
        } else if (location.equals("Beijing PanGeZhuang") && time.equals("evening")) {
            return new SecondHandAuto();
        } else {
            return null;
        }
    }
}

上述假设和具体情况有出入,暂且做如上假设。

地理位置和时间是决定性参数,可以有多种方式来编写工厂。还有常见的方式比如说使用switch或者字符串到对象的映射。

当只有一个决定性参数时,我们通常选择这两个。

如果您想避免每次都创建冗余对象,也可以用映射的方式。

客户端

那么我们客户端的代码如下:

public class Client {
    public static void main(String[] args) {
        Car car = CarFactory.getCar("Beijing TianAnMen", "morning");
        if (car != null) {
            car.showCarInfo();
        } else {
            System.out.println("Sorry, no car available");
        }
    }
}

那么执行上述代码,我们可以得到:

The car brand is BMW

总结

最后,我们来看一下使用工厂模式有什么好处。

  1. 松耦合,客户端不需要知道工厂类是如何工作的。客户端或工厂类不需要知道Car类的具体实现如何工作。
  2. 易于扩展,您可以向工厂添加更多的汽车,而无需更改客户端代码。
  3. 易于测试,您可以测试客户端代码,而无需更改工厂代码。您可以模拟工厂类来返回您想要测试的任何Car对象。
相关文章
|
传感器 IDE 开发工具
【FastBond2阶段1——基于ESP32C3开发的简易IO调试设备】
【FastBond2阶段1——基于ESP32C3开发的简易IO调试设备】
369 0
|
前端开发 JavaScript 安全
2023 年的 10 个前端趋势
2023 年的 10 个前端趋势
438 1
|
IDE 物联网 Unix
Linux上应用竟然可以轻松的移植到RTOS上
Linux上应用竟然可以轻松的移植到RTOS上
Linux上应用竟然可以轻松的移植到RTOS上
|
Oracle 关系型数据库 数据库连接
实时计算 Flink版操作报错之遇到Unable to register metrics as an,该怎么处理
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
Oracle 关系型数据库 MySQL
实时计算 Flink版产品使用合集之如何保存savepoint
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
Kubernetes 网络协议 Perl
k8s Failed to create pod sandbox: open /run/systemd/resolve/resolv.conf: no such file or directory
k8s Failed to create pod sandbox: open /run/systemd/resolve/resolv.conf: no such file or directory
969 0
|
机器学习/深度学习 计算机视觉
【计算机视觉 | 目标检测】RegionCLIP: Region-based language-image pretraining
RegionCLIP的目的便是实现从image-text pairs的匹配到region-text pairs的匹配。构建一个模型进行图像区域的推理研究(如目标检测),目的是学习一个包含丰富的对象概念的区域视觉-语义空间,以便它可以用于开放词汇的目标检测。实质上就是训练一个视觉编码器V,使它可以编码图像区域,并将它们与语言编码器L编码的区域描述相匹配。
|
前端开发 JavaScript
JavaScript判空设默认值的几种写法
JavaScript判空设默认值的几种写法
368 0
|
存储 监控 Go
时序数据库 InfluxDB(五)
时序数据库 InfluxDB(五)
294 1