简述23种设计模式
创建型设计模式:
1.工厂方法模式:所谓的工厂其实就是在实际的工程中,需要产生那些特定的子类的实例,所以要建立一个特定的类来实现这个工作,工厂建成之后就是给它一个对象名,它就能给你生成一个实际的对象。而工厂方法是对于这些工厂和产品类进一步的抽象,这样一来对于扩展就更加的支持了,而不用牵一发而动全身了。本来简单工厂模式是给名就产生类,但是只有代码的if判断,而要加入新的类名就要改很多,现在一个工厂负责一个产品,还满足了单一职责的原则。
2.抽象工厂模式:抽象工厂和工厂方法很相似,都是使用工厂来产生产品类,但是更加的抽象,也就是泛化,对于一个工厂我可以让他产生更多种的产品类。这就是对于产品进行抽象给出接口,就可以完成这样的工作了,产品簇的概念就相当于某一个品牌可以生产不同的产品一样。
3.建造者模式:建造者是要创建一个复杂的对象,这可能是一个组合对象,这需要一个类来扮演建造师的角色,指示对象如何进行组合,最后产生需要的类或对象,建造者类是在该模式中最重要的,用户只需调用建造者就能得到想要的对象。
4.原型模式:在项目中经常碰到多次创建一个相同类型的对象的情况,如果创建的过程太繁琐的话就会很耗费时间,而原型模式就是在解决这个问题,创建一个原型对象,之后要使用时可以直接批量的复制来使用,这在对于多线程的那种处理过程中,我感觉时很容易碰到的,对于最简单的登录来说,框架中都是允许原型的,而每一个不同的用户登录类又是单例的。
5.单例模式:很多时候只能允许出现一个相同的对象,上面刚提到单例,对于一个用户登录来说,你登录上去之后在其他的地方再登录机会出现顶掉的情况。只允许出现一个相同的类型,不可复制,也不可再次被创建,除非销毁之前的进程。
结构型设计模式:
6.适配器模式:类与类之间可能由于接口不存在而无法进行通信,这都是很常见的事情,毕竟提倡高内聚低耦合的。而在需要时那就需要建立适配器一样的东西,实现类之间的通信,这是不可避免的,这就是一个使不同种类包容,提高兼容性的模式。
7.桥接模式:这个模式就是为了解决多维度的问题,在一个问题的基础上在加一个要求,可以称之为二维的,比如需要一支笔,首先它是什么种类的笔,再有它是下什么颜色的水,这就是二维的事情,而该模式就是解决这样的问题,通过桥接将功能衔接起来。
8.组合模式:在面对这样的问题时大多使用到组合模式:对于一个实体,它可以是一个单独的对象,也可以是多个对象组合,还可以是组合在一起的多个团队,这种模式看起来麻烦图解却不麻烦,就是一个树状的结构,充当叶子节点的可以是单个实例,也可以是多个实例,还可以是一个组合。文件夹是最好的例子。
9.装饰模式:装饰模式是对于类进行加工,看起来就是在添加新的功能一样,但是却没有一味的使用继承来实现,而原有的类是可以选择是否加入新的功能的,也可以选择删除了某一功能,具体实现就是在组件类下两个子类一个产生具体的东西,一个负责给组建添加功能,而他们又是相关联的,最终产品就是组件和不同的装饰品关联在一起产生带有具体功能的东西。
10.外观模式:是要与多个对象进行交互时,我们不需要一一与对象建立联系,只需要建立一个外观类来帮我们联通所有的类。这个外观类就像一个门户网站一样,我们要访问的链接都在上面,不用我们一一输入域名去访问了,就是这么简单的东西。
11.享元模式:该模式顾名思义,元就是我们经常说的对象,就是实现对象的共享来节约资源。创建对象太多很容易耗费资源,享元模式是对于相似或者相同的对象进行重用。在这个模式中,对于细粒度的对象建立享元池,享元工厂是该模式的核心。
12.代理模式:有时候不能直接调用或不想直接引用一个对象,就需要一个第三者就是代理类来实现客户与目标类的通信,代理和实体有相同的父类,用户通过代理与实体进行通信,代理类有着自己特有的方法去访问实体类,一般代理与实体是关联的关系。
行为型设计模式:
13.职责链模式:对于一个请求处理上会有多个对象,可能只是权限不同有所划分,但是不能让一个类向多个处理相似请求的对象都发送一遍请求,所以职责链模式就是为了降低耦合让权限不同的处理对象排成一队,请求在上面进行传输,直到处理完成返回结果。
14.命令模式:将发布命令的对象与接收命令的对象隔离开,建立一个命令类来封装命令,发命令的类只是发布命令,命令类具体出命令实例来让执行者去执行,降低了耦合度,还实现了命令添加更加方便,体现了开闭原则。
15.解释器模式:对于一种特定的情况,通常要使用一种特别的算法去解决它,就像是为你的语言给出翻译一样让别人知道你的意思,其实就是给予特定的语法结构,让执行者能读懂你的意思,就像你发出一个back的指令,机器人知道是往后的意思一样。
16.迭代器模式:对于一个特定的数据结构给出一个特定的方法去访问它,而不需要去通晓它的结构,就像是看电视时,你只需要按遥控器就能让电视节目轮转而不会知道它到底是怎么实现的,可以理解成迭代器就是一个访问数据的方法。
17.中介者模式:在具体的实现中,需要对于对象直接加入中介者来进行降低耦合,中介者就是调节类和类之间关系的第三方,在现实中聊天工具就是中介者的一种,人与人通信有这个中转,可以更容易扩展。
18.备忘录模式:顾名思义,备忘录就是给自己的对象一个回滚的模型,可以记录某一时刻对象的状态,并提供一个撤销的按钮,你可以通过它来回到之前的状态就像是撤销了你之前的动作一样。其实就是提前做备份的一个模式。
19.观察者模式:对于一个实体提供一个监视器,当实体状态变化时,监视器会做出反应,又叫做模型视图模式,模型改变视图跟随改变,在当前流行的mvc模式中也用到了这个模式。实体变化有时不是很明显,监视器是另一个侦控的手段。
20.状态模式:对于一个实体来说,可能会有很多属性,这些属性的动态变化就是状态的改变,在我的理解就是状态可以说是实体属性变化时的外部显示,比如当一个人心情不好,别人看不到,但是可以看到情绪的变化,这个情绪可以说就是状态。
21.策略模式:对于一个任务可能有很多的完成方式,每一个方式都是一个策略,策略模式就是实现这些方式或算法的自由切换,具体的实现就是实体类对于策略抽象类关联,具体策略可以随意选择的一种模式,这个模式是比较好理解和使用的。
22.模板方法模式:该模式就是对于不同的过程提供不同方法调取,不同的过程可以说就是一个模板,调取方法时按照模板自身的方法步骤来进行调用,就像你要在银行办理业务,那么取款和存款是两个不同业务流程,也就相当于两个不同的模板,里面的每一步就是所谓的方法了。
23.访问者模式:对于一个实体不同的操作对象可能会有不同的操作,比如拿到一张药方,药房的人员就是负责抓药,而财务的就是统计总值,这对于实体操作的人员就是访问者,访问者有不同的访问方法,也可以是有不同的访问权限,这也是访问者模式的一种应用。