这是我见过讲的最全的设计模式:连动态代理和Visitor都讲到了ASM

461 阅读8分钟

前言

什么是设计模式?

设计模式(Design pattern)代表了最佳的实验总结,通常被有经验丰富的软件软件工程师所采用。设计模式是软件工程师在软件开发过程中面临的一般问题的解决方案。这些解决方案是相当多的软件开发人员经过很长的一段时间的试验和错误总结出来的。

设计模式的目的是什么?为什么要学习设计模式?

帮助我们将应用组织成容易了解,容易维护,具有弹性的架构,建立可维护的OO系统,要诀在于随时想到系统以后可能需要的变化以及应付变化的原则。

1、设计模式能让专业人之间交流方便,如下:

程序员A:这里我用了XXX设计模式

程序员B:那我大致了解你程序的设计思路了

2、易维护

项目经理:今天客户有这样一个需求…

程序员:明白了,这里我使用了XXX设计模式,所以改起来很快

3、设计模式是编程经验的总结

程序员A:B,你怎么想到要这样去构建你的代码

程序员B:在我学习了XXX设计模式之后,好像自然而然就感觉这样写能避免一些问题

4、学习设计模式并不是必须的,可以使用其他方法代替

程序员A:B,你这段代码使用的是XXX设计模式对吗?

程序员B:不好意思,我没有学习过设计模式,但是我的经验告诉我是这样写的

5、设计模式重语义而不重语法

一种设计模式可以使用多种语法实现

设计模式的分类

1.创建型模式

这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。工厂模式(Factory Pattern)

抽象工厂模式(Abstract Factory Pattern)

单例模式(Singleton Pattern)

建造者模式(Builder Pattern)

原型模式(Prototype Pattern)

2.结构型模式

这些设计模式关注类和对象的组合。继承的概念被用来组合接口和定义组合对象获得新功能的方式。适配器模式(Adapter Pattern)

桥接模式(Bridge Pattern)

过滤器模式(Filter、Criteria Pattern)

组合模式(Composite Pattern)

装饰器模式(Decorator Pattern)

外观模式(Facade Pattern)

享元模式(Flyweight Pattern)

代理模式(Proxy Pattern)

3.行为型模式

这些设计模式特别关注对象之间的通信。责任链模式(Chain of Responsibility Pattern)

命令模式(Command Pattern)

解释器模式(Interpreter Pattern)

迭代器模式(Iterator Pattern)

中介者模式(Mediator Pattern)

备忘录模式(Memento Pattern)

观察者模式(Observer Pattern)

状态模式(State Pattern)

空对象模式(Null Object Pattern)

策略模式(Strategy Pattern)

模板模式(Template Pattern)

访问者模式(Visitor Pattern)

4J2EE 模式

这些设计模式特别关注表示层。这些模式是由 Sun Java Center 鉴定的。MVC 模式(MVC Pattern)

业务代表模式(Business Delegate Pattern)

组合实体模式(Composite Entity Pattern)

数据访问对象模式(Data Access Object Pattern)

前端控制器模式(Front Controller Pattern)

拦截过滤器模式(Intercepting Filter Pattern)

服务定位器模式(Service Locator Pattern)

传输对象模式(Transfer Object Pattern

具体设计模式

抽象工厂模式 (Abstract Factory)提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类

目的及好处

首先,工厂模式是为了解耦:把对象的创建和使用的过程分开。就是Class 0 想调用 Class 1 ,那么0只是调用1的方法,而至于1的实例化,就交给工厂类。

其次,工厂模式可以降低代码重复。如果创建对象B的过程都很复杂,需要一定的代码量,而且很多地方都要用到,那么就会有很多的重复代码。我们可以这些创建对象B的代码放到工厂里统一管理。既减少了重复代码,也方便以后对B的创建过程的修改维护。

由于创建过程都由工厂统一管理,所以发生业务逻辑变化,不需要找到所有需要创建B的地方去逐个修正,只需要在工厂里修改即可,降低维护成本。同理,想把所有调用1的地方改成B的子类11,只需要在对应生产B的工厂中或者工厂的方法中修改其生产的对象为B1即可,而不需要找到所有的new 1()改为new 11()。

另外,因为工厂管理了对象的创建逻辑,使用者并不需要知道具体的创建过程,只管使用即可,减少了使用者因为创建逻辑导致的错误。

通俗来讲

设计模式的一个重要原则就是:别改代码,只需要添代码,以前所有的老代码,都是有价值的,需要尽力保留

new一个对象时,new的过程是宝贵的如何创建老对象的知识点(有的new很复杂,包括了很多参数),如果这个代码被修改了,那么保留的老对象也不知道怎么使用了,整个体系残缺了

所以要想办法保留老对象的new过程,把这个new过程保存分布到一系列工厂类里,就是所谓的工厂模式,一般有三种方式来封装

简单工厂:把对象的创建放到一个工厂类中,通过参数来创建不同的对象。

这个缺点是每添一个对象,就需要对简单工厂进行修改(尽管不是删代码,仅仅是添一个switch case,但仍然违背了“不改代码”的原则)

工厂方法:每种产品由一种工厂来创建,一个工厂保存一个new

基本完美,完全遵循 “不改代码”的原则

抽象工厂:仅仅是工厂方法的复杂化,保存了多个new 实例

大工程才用的上

工厂模式是创建型模式中最典型的模式,主要是用来创建对象,减少我们在使用某个对象时的new() 操作,我相信大家都有这样的困惑,目前我所在的项目都在程序开发的过程中,还是有很多的new()操作出现在表现层中,并没有通过工厂来创建对象,一方面可能是因为我们自身比较懒,不规范项目的编码形式,另外一方面也是由于项目的进度比较紧,没有那么多的时间去

完成工厂的统一创建,当然对于这样的动态创建对象的工厂,推荐的做法还是我们后面会讲到的创建型模式——《抽象工厂模式》来解决吧。

如果您并不知道工厂模式是用来干什么的,我们可以通过如下举例来说明,例如我们现在有个矿泉水加工厂,加工矿泉水,我们现在知道有矿泉水这个对象,那么当我批量生产矿泉水的时候,我们就通过工厂来批量的生产,等于我们程序中的批量创建对象。这时候我有很多个对象,也就是很多游客,他们每人都要一瓶矿泉水,这时候如果说把游客比作不同的应用程序模块,

这是我见过讲的最全的设计模式:连动态代理和Visitor都讲到了ASM

这种情况下,不同的游客需要矿泉水的时候,我就new()一个矿泉水和我找个加工厂生产矿泉水明显是有差别的,这个时候,游客不应该和矿泉水有

关联关系了,而且游客不知道,矿泉水是怎么生产出来的,也不需要关心这些东西。

基于面向对象的编程设计时,原则就是低耦合,对象和对象之间。那么对象之间的引用关系,可以通过抽象出接口,通过借口的依赖来解耦,降低系统的耦合性。

做Java的人,有谁不知道马士兵?

还记得十年前初学Java的时候,就是他带我入坑的,哈哈。

最近在跟马老师聊天的时候,拿到了他最新录制的【23种设计模式】和【算法】视频资料。

我打开仔细看了下,我感觉这是最全的【设计模式】了,比如在工厂模式中,马老师直接讲到SpringIOC原理。

再比如在动态代理模式和Visitor模式中,马老师直接讲到ASM

对于马老师设计模式视频感兴趣的朋友可以帮忙转发文章后,关注私信回复【学习】来免费获取

这是我见过讲的最全的设计模式:连动态代理和Visitor都讲到了ASM

我们再重温一下马士兵老师的口头禅:

“来,看我桌面。”

“豆芽子它长一房高,它也是一根菜。”

“骑着驴找马,但是不要虐待驴,别跟公司闹僵,公司也不会跟你过不去。”

“同学们用你们的大腿想想哪个最……?对,没错,就是这样,大家的大腿很发达。”

“不就是名字长一点吗,弗拉基米尔拉德马诺维奇其实简单来说就是列宁。”

马老师讲的视频还是很赞的,你们觉得呢?