Java设计模式之工厂模式

本文通过三个生动的场景介绍了三种工厂模式:简单工厂模式、工厂模式和抽象工厂模式,并详细阐述了它们之间的区别及适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天学习下最常见的工厂模式,工厂模式细分下来有三大类:

1.简单工厂模式

2.工厂模式

3.抽象工厂模式

工厂模式的目标都是:封装对象的创建。

场景一:

  • 忽然有一天,在梦中捡到了阿拉丁神灯.
  • 灯神说:“我可以带你到你想的地方旅游”
  • 一听,这么爽!接着
  • “但是一次只能满足你一个地方,可以传送你到美国、韩国、英国,你选一个。”,神灯又说。
  • 那我选:“去美国..还是..”。
  • 我还没考虑完,咻一下,就送到我去美国了。

普通实现方式 ##

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

输出结果:

这里写图片描述

我们在客户端普通写法可能是上述那样,需要是完成了对应的需求,但是那存在一定的问题。如果新增旅游地点,或者修改地点,那么客户端的代码也需要跟着需求修改。这样就违反了开闭原则。

因此,我们需要的是封装。于是简单的工厂模式出现了。

简单工厂模式

这里写图片描述

这里写图片描述

看完修改的代码,其实没有区别,就是将旅游地点封装起来。但是这样就是简单工厂模式的目的,将具体的方法从客户端删除。那么以后我们客户端的代码就不用修改了,我们改的是地点工厂类里面的方法,这样客户端就不用知道对象的创建具体过程。

我们现在是做到与客户端解耦了,但是,当旅游地点越来越多,客户端的代码是不用修改,但是我们地点工厂类需要不断地添加或修改。有没有什么方法做到即使实现类改变也不需要改变简单工厂的代码呢?于是出现了下面的情景。

场景二:
- 由于我当时还是纠结,神灯已经把我送到美国去了。所以我嘟囔着,我这还没决定呢啊,大兄弟,你这反应也太快了吧。
- 神灯:“你这人真是难侍候”
- 我:“我…能不能去伦敦呀?”
- 伦敦?英国呀?
- 我:“对呀!”
- 神灯:“你知不知道我需要改很多东西的啊,枚举要改,工厂类又要改…”
- 我:“大兄弟,求求你,好人做到底呗。”
- 神灯:“要不我给你一个接口好了,你自己想创建哪里就创建哪里的”
- 我内心..哟西.!

工厂模式

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

就这么愉快地玩耍了一周,想寄点明信片。于是到我们的抽象工厂模式。

场景三:

  • 在如此美丽的伦敦游玩,肯定少不了明信片的,我去找了一下神灯大兄弟。
  • 我:“神灯大哥好!”
  • 神灯:“小哥,在伦敦玩得挺开心的呀~!”。心想,找我肯定没好事。
  • 我:“神灯哥,我玩得挺开心的,但是我想跟我的朋友分享我的快乐,寄点明信片什么的。帮帮我可以吗?”
  • 神灯,果然没好事….

抽象工厂模式

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

输出结果:

这里写图片描述

从抽象工厂模式代码观察,好像只是多了一个抽象方法啊?没错,这就是工厂模式与抽象工厂模式的区别。工厂模式只有一个抽象方法,而抽象工厂模式有多个。

总结:

  • 普通模式与简单工厂模式

简单工厂模式解除了客户端与具体类的耦合,这样我们面对不同的需求,修改的是相关实现类,也不需要去修改客户端的代码,因为我们将变化的点封装起来了,那就是说将实例化的操作交到具体的类去完成。

  • 简单工厂模式与工厂模式

而工厂模式比简单工厂模式的好,试着这样理解,这有一个开放-封闭原则。对扩展开放,对修改封闭。如果用简单工厂的话,每增加一种产品(扩展),都要去增加factory的case(修改,违背了开放-封闭原则);但是用工厂模式,我们就不用去改factory(对修改封闭),而只是去增加对应新增那个产品类的工厂,实现工厂接口就可以了(对扩展开放)。

  • 工厂模式与抽象工厂模式

工厂模式针对单独产品的创建,而抽象工厂注重一个产品系列的创建。如果产品系列只有一个产品的话,那么抽象工厂就退换到工厂模式了。在抽象工厂中使用工厂方法来提供具体实现,这个时候他们联合使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值