浅谈工厂模式
2021/11/29 23:36:22
本文主要是介绍浅谈工厂模式,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
工厂模式是一种设计模式,它允许您在不向客户端公开实例化逻辑的情况下创建对象。
它是一种将对象的实例化委托给工厂类的方法,而客户端无需决定要实例化的具体类。
让我们来看看一些术语:
-
客户端:需要对象的类。
-
工厂:创建对象的类。
-
决定参数:工厂类用来决定实例化哪个具体类的参数。
-
抽象:当客户端获得一个对象时,它希望它做一些事情。它需要知道它需要哪些类型的对象。
举个例子
你在滴滴上叫一辆车,在订单还没有被接单时,你并不知道来接你的是什么车,只有等到正式有人接单了,你才知道你乘坐的车的具体信息。
把上述场景和工厂模式进行对比,
你是客户端;
滴滴是工厂,他会给你派一辆车,来接你;
时间和地理位置是滴滴决定给你派什么车的依据;
而汽车是抽象概念。你确定你需要一辆车,而且会得到一辆车。
具体实现
接下来我们看看如何实现上述实例:
创建一个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
总结
最后,我们来看一下使用工厂模式有什么好处。
-
松耦合,客户端不需要知道工厂类是如何工作的。客户端或工厂类不需要知道Car类的具体实现如何工作。
-
易于扩展,您可以向工厂添加更多的汽车,而无需更改客户端代码。
-
易于测试,您可以测试客户端代码,而无需更改工厂代码。您可以模拟工厂类来返回您想要测试的任何Car对象。
这篇关于浅谈工厂模式的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-15鸿蒙生态设备数量超8亿台
- 2024-05-13TiDB + ES:转转业财系统亿级数据存储优化实践
- 2024-05-09“2024鸿蒙零基础快速实战-仿抖音App开发(ArkTS版)”实战课程已上线
- 2024-05-09聊聊如何通过arthas-tunnel-server来远程管理所有需要arthas监控的应用
- 2024-05-09log4j2这么配就对了
- 2024-05-09nginx修改Content-Type
- 2024-05-09Redis多数据源,看这篇就够了
- 2024-05-09Google Chrome驱动程序 124.0.6367.62(正式版本)去哪下载?
- 2024-05-09有没有大佬知道这种数据应该怎么抓取呀?
- 2024-05-09这种运行结果里的10.100000001,怎么能最快改成10.1?