前言框架的源码,或者报读一些在线课程来提升自己。最近老公司的一个同事找我聊这个问题,说他最近刚换了公司,但是写出来的代码感觉很“low”,codereview的时候总是给他各种建议。我有几年的经验。还在犯那种新手错误,写代码完全没有格局和设计美感。而当你想学习技术的深度(看框架源码)的时候,你总觉得只了解了表面,却没有了解里面的思想。在座的各位应该都知道我想说什么。没错,就是设计模式。其实这也是我工作的第一年和第二年一直在思考的问题。为什么要学习设计模式?设计模式的优点是什么?完善查看框架源码提高代码设计能力和复杂业务逻辑编码能力,为面试和以后的职业道路打下坚实的基础+工厂+单例模式,我只需要多个工厂类型,然后通过责任链,复用他的单例就可以了,这就是设计模式的好处,可以装X,造福子孙后代。正文今天要讲的就是工厂模式。工厂模式在我们的电子商务领域被广泛使用。写之前看了一下自己电脑项目的代码,确实到处都是。工厂模式可以分为三类:简单工厂模式工厂方法模式抽象工程模式今天主要围绕这三种模式举例来理解简单工厂模式工厂模式主要用于封装实现逻辑,以及通过公共接口提供实例化对象的服务。当我添加一个新的类时,我不需要开战,只需稍微修改一下即可。比如我之前的电商业务是如何创建产品的:在这个简单的工厂中,如果要创建活跃的产品1和活跃的产品2,当我们要创建产品的时候,只需要调用创建产品的方法即可简单工厂,根据类型创建不同的产品然后实例化返回即可。简单工厂的几种实现方式:静态工厂模式我们还是以创建产品的方式为例。按照类型创建不同的产品貌似没有问题,但是有一个问题不知道大家有没有发现?一种,是不是要修改createProduct方法的ifelse?这不是违背了我们的开闭原则吗?所以这个方法不好,我们有两个选择:使用反射机制直接注册product对象,添加一个Type类型的方法,根据type类型返回相同类型的方法。同样的,我们还是以商品的创建为栏目:反射实现看上面的代码,发现反射其实实现起来很简单,但是在某些特定的情况下,并不适用,在某些特定的情况下无法实现,反射机制也会降低程序的运行效果。对性能要求高的场景应该避免这种实现。这里还有一个问题。反射应用不当很容易导致线上机器出现问题,因为我们反射创建的对象属性是被SoftReference软引用的,所以当**-XX:SoftRefLRUPolicyMSPerMB**没有设置时,机器会一直CPU高.当然他的默认值是1000,所以要看你的情况,反正注意这一点就好了。剩下的其实和反射的实现很像。为了避免使用反射,Map的对象中并没有存储要添加的类,而是存储每个要添加的类对象的实际列。我不会为此编写演示😂工厂方法模式工厂方法模式是静态工厂模式的改进。我们的工厂类是直接抽象出来的,把需要具体化的逻辑代码转给抽象方法的实现。在子类中,这样我们就不需要去修改工厂类(也就是不需要做任何ifelse的修改)这也是我们目前正在使用的一种方式。或者我们以创建一个产品为例:看这张图其实就是创建一个工厂来创建一个工厂对象。接下来我们看看代码是如何实现这个功能的:这里我们先创建一个抽象工厂方法,然后创建一个商品工厂来继承这个抽象工厂方法。当有其他类型时,我们只需要继承我们创建的工厂方法即可。这段代码大家都可以实现,但是我们真正需要学习的是前人工厂模式的思想。只有将这种思维应用到我们真实的业务场景中,学以致用,才能有真正的提升。再举个例子:学以致用假设现在领导要你分享一张商品图片,我们知道商品有很多种,比如没有SKU的商品,有SKU的商品,订单分享,邀请分享……等等一系列的场景。那么我们如何设计这段代码,使其更易于理解、阅读和日后扩展呢?ps:sku和spu是我们电商里的名词,spu和item几乎是同一个维度,是商品。一个commodityitem有很多sku,比如:iphone是一个commodity,一个item,一个spu,whiteiphone1264G是一个特定的sku。第一步,我们都应该定义一个创作共享模板。在第二步中,我们创建一个共享工厂以根据我们的类型获取我们预加载到Spring容器中的bean列。最后定义我们不同的类型来实现图片共享。其实,我们研究设计模式,也正是这种思路。有了这样的思维,上面提到的三个优势就可以体现我们未来的成长,提高我们面对复杂业务设计和思考的能力。那么问题来了,我们什么时候应该使用工厂方法模式而不是简单工厂模式呢?在组合其他类对象进行各种初始化操作时,我们推荐使用工厂方法模式,将复杂的创建逻辑拆分到多个工厂类中,这样每个工厂类都不会太复杂。但是,使用简单工厂模式,将所有的创建逻辑都放在一个工厂类中,会使工厂类变得非常复杂。看完工厂方法模式,就更容易理解抽象工厂模式了,因为它其实是工厂方法的一种扩展。工厂方法类中只有一个抽象方法。如果要实现各种不同的类对象,只能创建具体工厂方法的不同子类来实现。抽象工厂就是让一个工厂负责创建多个不同的类型。该对象感觉有点难以理解。让我们画一幅画。它可能有点难看,但它可以说明问题。其实可以分为以上几个部分:抽象工厂类具体工厂类抽象类抽象工厂类我个人可以理解为刚出厂的手机。具体的抽象工厂就是我们每个人为这部手机定制壁纸。我理解的最后一个抽象类是手机壁纸。我们每个人都可以自定义不同的壁纸如:动图姐姐、静图风景、小傻瓜等。最后,在几家电商任职期间,看过不少大佬的代码。我该如何描述它们?都是各种各样的设计模式,看起来真的是无敌优雅,而且我们直接通过传参访问也很方便足够了。设计模式在我们的业务代码中无处不在。写这篇文章的时候,我特意翻了一下我们之前的项目。基本上,在每个项目中都可以看到它们。和以前的同事聊天后体会更深。其实我们是想走得更高更远,所以我们不能停止学习。以后可能会针对设计模式写一个互联网公司的流程引擎,看我们如何把它用于更复杂的业务逻辑。实现它的框架。我是敖丙,知道的越多,不知道的越多,谢谢各位达人:点赞、收藏和评论,我们下期再见!
