敖丙所在的电商公司都是怎么用工厂模式的

前言

不知道随着大家工作年限的增长,有没有一种危机感,害怕自己的技术深度开始没有提升,所以经常会去看一点框架的源码,或者报一些网课去提升自己。

最近我有一个老东家的同事跟我聊起来这个问题,说最近刚换公司了,但是自己的写的代码感觉很“low”,在codereview的时候总能被提出各种建议,几年经验了还在犯那种新手的错,写代码毫无模式和设计美感可言。

而且在想学习技术深度的时候(看一写框架的源码)总感觉只理解了表面,而没有理解里面的思想。

这里大家应该都知道我想说什么了,没错就是 设计模式,其实这也是我刚工作第一年第二年不断在思考问题,为什么要学设计模式?设计模式优点有哪些?

  • 提升查看框架源码的能力
  • 提升自己对复杂业务的逻辑的代码设计能力以及code能力
  • 对面试以及后面的职场道路打下扎实的基础

比如我之前做电商活动的时候,我之前做会场活动的小伙伴就用了责任链+工厂+单例的模式,我只需要多个工厂类型,然后责任链传递,复用他的单例就ok了,这就是设计模式的好处,可以装X还可以造福后人。

正文

今天我就聊一下工厂模式,工厂模式在我们的电商领域的应用是非常广泛的。写之前我看了自己电脑项目的代码,确实随处可见。

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

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

今天我也主要围绕这三种模式来举例了解一下

简单工厂模式

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

举个例子我之前所在的电商业务怎么创建创建商品的:

在这个简单工厂里面,如果要创建活动商品1 以及活动商品2,我们要创建商品的时候只要调用简单工厂里面的创建商品方法,根据类型创建出不同的商品然后实列化返回就可以了。

简单工厂几种实现方式:

静态工厂模式

我们还是以创建商品为列子

这种方式创建看起来其实也没什么问题,根据类型创建不同的商品,但是有一个问题不知道大家发现没有?

是不是我每增加一种类型是不是我还要去修改createProduct方法的 if else?这不是违背我们的开闭原则吗?

所以这种方式不好,我们还有接来的两种:

  • 使用反射机制

  • 直接注册商品对象,添加一个Type类型方法,根据type类型返回自身相同类型的方法

    同样的我们还是以创建商品为列:反射实现

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

这里还有一个问题适用反射不当是容易导致线上机器出问题的,因为我们反射创建的对象属性是被SoftReference软引用的,所以当**-XX:SoftRefLRUPolicyMSPerMB** 没有设置好的话会一直让机器CPU很高。

当然他的默认值是1000,也就根据大家的情况而定吧,反正就是注意一下这点。

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

工厂方法模式

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

还是我们以创建商品为例:

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

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

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

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

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

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

我再给大家举一个列子:学以致用

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

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

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

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

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

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

那么问题来了,什么时候该用工厂方法模式,而非简单工厂模式呢?

这里引用设计模式之美里面的一句话:当对象的创建逻辑比较复杂,不只是简单的 new 一下就可以,而是要组合其他类对象,做各种初始化操作的时候,我们推荐使用工厂方法模式,将复杂的创建逻辑拆分到多个工厂类中,让每个工厂类都不至于过于复杂。

而使用简单工厂模式,将所有的创建逻辑都放到一个工厂类中,会导致这个工厂类变得很复杂

抽象工厂模式

看完工厂方法模式,再理解抽象工厂模式就更加简单,因为它其实就是工厂方法的一个延伸。

工厂方法类中只有一个抽象方法,要想实现多种不同的类对象,只能去创建不同的具体工厂方法的子类来实列化,而抽象工厂 则是让一个工厂负责创建多个不同类型的对象

感觉理解起来有点绕,我们还是来画个图吧

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

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

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

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

结尾

我在几家电商公司任职期间,见过很多大佬的代码,怎么形容呢,就是各种各种设计模式,看起来真的无敌优雅,然后我们接入的时候还很方便,直接传参数就好了。

我们的业务代码中设计模式本身就是无处不在的,我在写这个文章的时候刻意翻看我们以前的项目,基本每个项目里面都能看到他们的身影,在跟我前同事聊过之后体会更深了。

其实我们想要走的更高更远,那我们学习的脚步就不能一直停下,后面我可能会针对设计模式写一个互联网公司的流程引擎,来看看我们针对更复杂的业务逻辑我们怎么运用框架去实现它。

(0)

相关推荐

  • PHP设计模式之简单工厂模式

    PHP设计模式之简单工厂模式 先从简单工厂入门,不管是面试还是被他人面试,在问到设计模式的时候,大多数人都会提到工厂模式.毫无疑问,工厂相关的几种模式在设计模式中是最出名的也是应用比较广泛的一种模式. ...

  • 程序猿必备系列:开发者的蓝图之初探分类

    导语:前天端午想着努力再更一篇,没想到被各种杂事耽搁了,先给大家补个端午安康.上一篇忙着说设计模式有多重要了,反而关于设计模式本身介绍的有点少,这一篇给大伙好好说说设计模式的到底有哪些. 这次就不扯闲 ...

  • Python设计模式是什么?Python入门

    设计模式想必大家都比较熟悉,它是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结,使用设计模式可以让代码更容易被他人理解.保证代码的可靠性,而且使用设计模式还需要遵循一定的原则.那么P ...

  • 创建型设计模式总结

    Intro 前面几篇文章已经把创建型设计模式都介绍了,来做一个简单的总结. 创建型设计模式,就是用来创建对象的设计模式,根据要创建的对象的复杂度以及是否允许多实例以及是否需要容易扩展等多方面考虑去选择 ...

  • 怎么样让你写的程序分工又分家?

    导语:这次是开发者蓝图系列的第二篇,让我们好好聊聊工厂方法模式的前世今生. 之前猿哥就说了,设计模式是源于万千程序猿的真实项目的开发经验,并超脱这些经验,给出的解决方案. 工厂方法模式当然也不例外,它 ...

  • PHP设计模式之工厂方法模式

    PHP设计模式之工厂方法模式 上回说到,简单工厂不属于GoF的二十三种设计模式,这回可就来真家伙了,大名顶顶的工厂方法模式前来报道! GoF类图解释 工厂方法模式对比简单工厂来说,最核心的一点,其实就 ...

  • [PHP小课堂]PHP设计模式之工厂方法模式

    [PHP小课堂]PHP设计模式之工厂方法模式 关注公众号:[硬核项目经理]获取最新文章 添加微信/QQ好友:[DarkMatterZyCoder/149844827]免费得PHP.项目管理学习资料

  • 李湘王岳伦退出电商公司,明星直播带货接连翻车,还能火爆多久?

    2020年直播带货可谓是真的火,尤其是很多明星涌入直播带货平台,凭借着自己的名气来进行销售.不少人的成绩也是很不错的.因为直播带货的大火,不少明星还加盟或者是开办了属于自己的电商公司.可进入2021年 ...

  • 京东 顺丰 菜鸟 苏宁 四通一达 这些大牌电商快递都是如何打造智能物流线?

    从目前电商企业在物流领域发力情况来看,京东.菜鸟.顺丰.苏宁的智能物流已经成为一个必然选择.虽然在物流的布局上路数不同,但行业的共识问题,零售下半场,物流将是重中之重.电商物流系统京东组建子公司 无人 ...

  • 辛巴闭卷,老罗开卷,直播电商圈都该抄这份“危机公关”作业了

    标"星标",有干货,有工作! 第1145篇 原创文章 "网络直播售假风波"越刮越猛,从快手一哥辛巴刮到了抖音一哥罗永浩. 老罗昨天晚上发布声明,针对交个朋友直播 ...

  • 估值3000亿,中国最神秘电商公司,征服美国年轻人

    文|王亚琪 编辑|斯问 "SHEIN是什么,怎么拼?"和国内互联网人士讨论这个电商平台,大多是一脸的好奇.但对外国人来说,它在服装界的受欢迎程度堪比中国人的"淘宝&quo ...

  • 特朗普又双叒叕“退群”!新三板跨境电商公司会受影响吗?

    若美国真的退出万国邮政联盟,对新三板上的跨境电商公司会有一定的影响,但不会对公司的经营造成重大影响. 相关新闻 美国白宫10月17日发表声明称,美国总统特朗普决定接受美国务院的建议,启动退出万国邮政联 ...

  • [贰]还把阿里当电商公司?太幼稚了!|去电商化

    从电商起家,带着电商基因,但如果还是把阿里巴巴简单的理解成一家电商公司,当华尔街还在把阿里巴巴跟亚马逊.或ebay,甚至是沃尔玛进行比较的时候,只能说,华尔街已经过时了! 6月14日阿里巴巴投资日大会 ...

  • 知道电商公司为什么离职率那么高吗?

    且看下面: 一般运营入职到离职的工作流程 第一周:高兴入职,熟悉后台,看数据,了解产品,了解公司,听老板上司吹牛逼画大饼 第二周:分析数据,研究同行竞品,公司下达任务干一个亿,做规划和目标分解 第三周 ...

  • 电商公司中招字体版权:索赔两万元!

    最近有网友向松松编辑杰哥爆料,又有一家电商公司被方正字体以字体侵权给告了,每套字体索赔两万元,字体,还是字体!不管是自媒体还是电商,商用的字体和图片必须要注意版权问题呀! 以下是该电商公司收到的字体公 ...

  • 每日5000单的电商公司存活一样艰难

    十年前,中国开启了电商之路,我们,应该准确地说,我,在35岁的年纪搭上了电商这趟列车,也让一事无成的我,无意中抓到了一丝丝的机会,活了下来,吹个牛,相对体面得活了下来! 大家见惯了一大排打印机,其实一 ...