简单工厂-工厂方法-抽象工厂模式

工厂模式的本质就是对获取对象过程的抽象

以下博客转载自知乎敖丙大神:工厂模式(factory Method)的本质是什么?

工厂模式主要可以分为三大类:

  • 简单工厂模式
  • 工厂方法模式
  • 抽象工程模式

简单工厂模式

工厂模式主要是用于对实现逻辑的封装,通过对公共接口提供对象的实例化服务,在添加新的类时不需大动干戈,只要修改一点点就好。

举个例子我之前所在的电商业务怎么创建创建商品的:
在这里插入图片描述
在这个简单工厂里面,如果要创建活动商品1 以及活动商品2,我们要创建商品的时候只要调用简单工厂里面的创建商品方法,根据类型创建出不同的商品然后实列化返回就可以了。

简单工厂几种实现方式:在这里插入图片描述

这种方式创建看起来其实也没什么问题,根据类型创建不同的商品,但是有一个问题不知道大家发现没有?是不是每增加一种类型还要去修改createProduct方法的 if else?这不是违背我们的开闭原则吗?所以这种方式不好,我们还有接来的两种:

  • 使用反射机制
  • 直接注册商品对象,添加一个Type类型方法,根据type类型返回自身相同类型的方法 同样的我们还是以创建商品为列:反射实现

看上面的代码,我发现反射其实也很容易就实现了,但是在一些特定的情况下,并不适用,而且在某些特定的情况下是无法实现的,而且反射机制也会降低程序的运行效果,在对性能要求很高的场景下应该避免这种实现。这里还有一个问题

使用反射不当是容易导致线上机器出问题的,因为我们反射创建的对象属性是被SoftReference软引用的,所以当-XX:SoftRefLRUPolicyMSPerMB
没有设置好的话会一直让机器CPU很高。 当然他的默认值是1000,也就根据大家的情况而定吧,反正就是注意一下这点。

剩下的一种其实很反射实现很像,就是为了避免使用反射,在Map的对象中不存要添加的类,而是将要添加的每种类对象实例。

工厂方法模式

工厂方法模式是对静态工厂模式的一种改进,我们的工厂类直接被抽象化,需要具体的逻辑代码转移到实现抽象方法的子类中,这样我们就不要再去修改工厂类(即:不用再去做什么if else 修改)这也是我们当前比较常用的一种方式。
还是我们以创建商品为例:

看这张图 其实说白了就是再创建一个工厂,用来创建工厂类对象

接下来我们看下代码怎么来实现这个功能吧:

这里我们先创建一个抽象工厂方法

再创建一个商品工厂去继承抽象工厂方法。

当还有其他类型的时候我们只要去继承我们创建的工厂方法可以了

这个代码大家肯定都能实现出来,但是我们真正的需要学习的是前辈们的这种工厂模式的思想。把这种思想运用到我们真实的业务场景中,学以致用才能对我们有真正的提升。

我再给大家举一个例子:学以致用
假设现在leader要你做一个分享商品图片,我们知道商品的类型 有很多,比如 无SKU 商品,有SKU 商品,下单分享,邀请分享…等一系列的场景。那我们怎么去设计这个代码做到更加的易懂,易读,今后扩展性好呢?

ps:sku和spu是我们电商里面的名词,spu差不多跟item也就是商品是一个维度,一个商品item有很多sku,比如:iphone是一个商品是item 也是spu,白色的iphone 12 64G 就是一个具体的sku。

第一步我们应该都是定义一个创建分享模版

第二步我们再创建一个分享工厂根据我们的类型获取我们预先加载在Spring容器中的bean实列

最后就是定义我们不同的类型来实现分享图片。

其实我们学习设计模式就是这种思想,有了这种思想 上面提到的三点优势才能体现出来对我们今后的成长,面对复杂业务设计以及思考能力才能提升。

那么问题来了,什么时候该用工厂方法模式,而非简单工厂模式呢?
这里引用设计模式之美里面的一句话:当对象的创建逻辑比较复杂,不只是简单的 new 一下就可以,而是要组合其他类对象,做各种初始化操作的时候,我们推荐使用工厂方法模式,将复杂的创建逻辑拆分到多个工厂类中,让每个工厂类都不至于过于复杂。 而使用简单工厂模式,将所有的创建逻辑都放到一个工厂类中,会导致这个工厂类变得很复杂

抽象工厂模式

看完工厂方法模式,再理解抽象工厂模式就更加简单,因为它其实就是工厂方法的一个延伸。 工厂方法类中只有一个抽象方法,要想实现多种不同的类对象,只能去创建不同的具体工厂方法的子类来实例化,而抽象工厂 则是让一个工厂负责创建多个不同类型的对象 。 感觉理解起来有点绕,我们还是来画个图吧

样子可能有点丑,但是能说明问题,其实看上去可以分为以上几个部分组成:

  • 抽象工厂类
  • 具体工厂类
  • 抽象类

抽象工厂类我个人可以理解为一个刚出厂的手机,具体抽象工厂这是认为我们每个人对这个手机壁纸自定义设置,最后抽象类我理解就是手机壁纸。

我们每个人可以自定义不同壁纸比如:动图妹妹,静图风景,小傻瓜等等

转载自:工厂模式(factory Method)的本质是什么?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值