单例模式的几种实现方式简述23种软件设计模式
简述23种软件设计模式
⼀、设计模式分类
总体来说设计模式分为三⼤类:
五种创建型模式:⼯⼚⽅法模式、抽象⼯⼚模式、单例模式、建造者模式、原型模式。
七种结构型模式:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
⼗⼀种⾏为型模式:策略模式、模板⽅法模式、观察者模式、迭代⼦模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
⼆、设计模式概述
创建型模式
1.⼯⼚⽅法模式
⼯⼚⽅法模式的创建是因为简单⼯⼚模式有⼀个问题,在简单⼯⼚模式中类的创建依赖⼯⼚类,如果想要拓展程序,必须对⼯⼚类进⾏修改,这违背了开闭原则,所以就出现了⼯⼚⽅法模式,只需要创建⼀个⼯⼚接⼝和多个⼯⼚实现类,⼦类可以⾃⼰决定实例化哪⼀个⼯⼚类,client类针对抽象接⼝进⾏编程,如果需要增加新的功能,继承⼯⼚接⼝,直接增加新的⼯⼚类就可以了,创建过程延迟到⼦类中进⾏,不需要修改之前的代码,满⾜了开闭原则,达到灵活地⽣产多种对象。
2.抽象⼯⼚模式
抽象⼯⼚模式是提供⼀个创建⼀系列相关或相互依赖对象的接⼝,⽽⽆需指定它们具体的类。区别于⼯⼚⽅法模式的地⽅,⼯⼚⽅法模式是创建⼀个⼯⼚,可以实现多种对象;⽽抽象⼯⼚模式是提供⼀个抽象⼯⼚接⼝,⾥⾯定义多种⼯⼚,每个⼯⼚可以⽣产多种对象。前者的重点在于"怎么⽣产",后者的重点在于"⽣产哪些";前者是⼀个抽象产品类,可以派⽣出多个具体产品类,后者是多个抽象产品类,每个抽象产品类可以派⽣出多个具体产品类;前者的每个具体⼯⼚类只能创建⼀个具体产品类的实例,后者的每个具体⼯⼚类可以创建多个具体产品类的实例。
3.单例模式
单例模式能保证⼀个类仅有⼀个实例,并提供⼀个访问它的全局访问点,同时在类内部创造单⼀对象,通过设置权限,使类外部⽆法再创造对象。单例对象能保证在⼀个JVM中,该对象只有⼀个实例
存在,这样做的好处就在于如果某些类创建⽐较频繁,特别是对于⼀些⼤型的对象,这是⼀笔很⼤的系统开销。在创建的时候,省去了new操作符,降低了系统内存的使⽤频率,减轻了系统的压⼒。同时单例模式保证在⼀个jvm中仅存在⼀个实例的好处就在于好⽐⼀个军队当中只会存在⼀个最⾼级别的军官来指挥整个军队,这样才能保证独⽴控制整个过程,否则如果出现多个,肯定会杂乱⽆序。
4.建造者模式
建造者模式是将⼀个复杂的构建与其表⽰相分离,使得同样的构建过程可以创建不同的表⽰,就好⽐是每个饭店或者每家都会做西红柿炒鸡蛋,最后虽然都是西红柿炒鸡蛋的外观,但是由于当中的做饭过程存在差别,所以味道会不同。在程序当中就是将⼀些不会变的基本组件,通过builder来进⾏组合,构建复杂对象,实现分离。这样做的好处就在于客户端不必知道产品内部组成的细节;同时具体的建造者类之间是相互独⽴的,对系统的扩展⾮常有利,满⾜开闭原则;由于具体的建造者类是独⽴的,因此可以对建造过程逐步细化,⽽不对其他的模块产⽣任何影响。
5.原型模式
原型模式是⽤原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。其实就是将对象复制了⼀份并返还给调⽤者,对象需继承Cloneable并重写clone()⽅法。原型模式的思想就是将⼀个对象作为原型,对其进⾏复制、克隆,产⽣⼀个和原对象类似的新对象。分为浅复制和深复制,前者是
将⼀个对象复制后,基本数据类型的变量都会重新创建,⽽引⽤类型,指向的还是原对象所指向的;后者是将⼀个对象复制后,不论是基本数据类型还有引⽤类型,都是重新创建的。
结构型模式
6.适配器模式
适配器模式是使得原本由于接⼝不兼容⽽不能⼀起⼯作的那些类可以⼀起⼯作,衔接两个不兼容、独⽴的接⼝的功能,使得它们能够⼀起⼯作,适配器起到中介的作⽤。
7.装饰模式
装饰器模式是动态地给⼀个对象添加⼀些额外的职责,给⼀个对象增加⼀些新的功能,要求装饰对象和被装饰对象实现同⼀个接⼝,装饰对象持有被装饰对象的实例。除了动态的增加,也可以动态的撤销,要做到动态的形式,不可以⽤继承实现,因为继承是静态的。
8.代理模式
代理模式是为其他对象提供⼀种代理以控制对这个对象的访问,也就是创建类的代理类,间接访问被代理类的过程中,对其功能加以控制。它和装饰器模式的区别在于,装饰器模式为了增强功能,⽽代
理模式是为了加以控制。代理模式就是多⼀个代理类出来,替原对象进⾏⼀些操作,例如买⽕车票不⼀定在⽕车站买,也可以去代售点。再⽐如打官司需要请律师,因为律师在法律⽅⾯有专长,可以替我们进⾏操作。
9.外观模式
外观模式是为⼦系统中的⼀组接⼝提供⼀个⼀致的界⾯,外观模式定义了⼀个⾼层接⼝,这个接⼝使得这⼀⼦系统更加容易使⽤。在客户端和复杂系统之间再加⼀层,提供⼀个容易使⽤的外观层。外观模式是为了解决类与类之家的依赖关系的,外观模式就是将他们的关系放在⼀个Facade类中,降低了类类之间的耦合度,⽐如搜狐门户⽹站,就利⽤了外观模式。
10.桥接模式
桥接模式是将抽象部分与实现部分分离,使它们都可以独⽴的变化。桥接模式就是把事物和其具体实现分开,使他们可以各⾃独⽴的变化(突然联想到了mvc模式)。将抽象化与实现化解耦,使得⼆者可以独⽴变化,就好⽐现在常说的mvc模式,view和model之间通过control 来控制,达到⾼内聚低耦合来解耦的⽬的。
11.组合模式
组合模式是将对象组合成树形结构以表⽰"部分-整体"的层次结构,组合模式使得⽤户对单个对象和组合对象的使⽤具有⼀致性。创建了⼀个包含⾃⼰对象组的类,并提供修改对象组的⽅法。在系统的⽂件和⽂件夹的问题上就使⽤了组合模式,⽂件下不可以有对象,⽽⽂件夹下可以有⽂件对象或者⽂件夹对象。
12.享元模式
享元模式是运⽤共享技术有效地⽀持⼤量细粒度的对象。享元模式的主要⽬的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,重⽤现有的同类对象,若未到匹配的对象,则创建新对象,这样可以减少对象的创建,降低系统内存,提⾼效率。
⾏为型模式
13.策略模式
策略模式是定义⼀系列的算法,把它们⼀个个封装起来, 并且使它们可相互替换,且算法的变化不会影响到使⽤算法的客户。。是为了统⼀接⼝下的⼀系列算法类(也就是多种策略),⽤⼀个类将其封装起来,使这些策略可动态切换。策略模式属于⾏为型模式,是为了使这些策略可以相互切换,是为了选择不同的⾏为。
14.模版⽅法模式
模板⽅法模式是定义⼀个操作中的算法的⾻架,⽽将⼀些步骤延迟到⼦类中。该模式就是在⼀个抽象类中,有⼀个主⽅法,再定义1...n个⽅法,可以是抽象的,也可以是实际的⽅法,定义⼀个类,继承该抽象类,重写抽象⽅法,通过调⽤抽象类,实现对⼦类的调⽤。模板⽅法使得⼦类可以不改变⼀个算法的结构即可重定义该算法的某些特定步骤,将⼀些固定步骤、固定逻辑的⽅法封装成模板⽅法。调⽤模板⽅法即可完成那些特定的步骤。
15.观察者模式
观察者模式是定义对象间的⼀种⼀对多的依赖关系,当⼀个对象的状态发⽣改变时,所有依赖于它的对象都得到通知并被⾃动更新。也就是当被观察者状态变化时,通知所有观察者,这种依赖⽅式具有双向性,在QQ邮箱中的邮件订阅和RSS订阅,当我们浏览⼀些博客时,经常会看到RSS图标,意思就是,当你订阅了该⽂章,如果后续有更新,会及时通知你。这种现象即是典型的观察者模式。
16.迭代器模式
迭代器模式是提供⼀种⽅法顺序访问⼀个聚合对象中各个元素, ⽽⼜⽆须暴露该对象的内部表⽰。在Java当中,将聚合类中遍历各个元素的⾏为分离出来,封装成迭代器,让迭代器来处理遍历的任务;
使简化聚合类,同时⼜不暴露聚合类的内部,在我们经常使⽤的JDK中各个类也都是这些基本的东西。
17.责任链模式
责任链模式是避免请求发送者与接收者耦合在⼀起,让多个对象都有可能接收请求,将这些对象连接成⼀条链,并且沿着这条链传递请求,直到有对象处理它为⽌。有多个对象,每个对象持有对下⼀个对象的引⽤,这样就会形成⼀条链,请求在这条链上传递,直到某⼀对象决定处理该请求。但是发出者并不清楚到底最终那个对象会处理该请求。在⽣活中学⽣进⾏请假的过程中,会涉及到,学⽣请假会⼀级⼀级往上批,最终处理,具体由谁批准可能不清楚。在程序当中,现在使⽤的struts即⽤到了责任链模式。
18.命令模式
命令模式是将⼀个请求封装成⼀个对象,从⽽使发出者可以⽤不同的请求对客户进⾏参数化。模式当中存在调⽤者、接收者、命令三个对象,实现请求和执⾏分开;调⽤者选择命令发布,命令指定接收者。举个例⼦,司令员下令让⼠兵去⼲件事情,司令员的作⽤是发出⼝令,⼝令经过传递,传到了⼠兵⽿朵⾥,⼠兵去执⾏。司令⼠兵命令三者相互解耦,任何⼀⽅都不⽤去依赖其他⼈。其实struts框架也涉及到命令模式的思想。
19.备忘录模式
备忘录模式是在不破坏封装性的前提下,捕获⼀个对象的内部状态,并在该对象之外保存这个状态。创建⼀个备忘录类,⽤来存储原始类的信息;同时创建备忘录仓库类,⽤来存储备忘录类,主要⽬的是保存⼀个对象的某个状态,以便在适当的时候恢复对象,也就是做个备份。在系统当中使⽤的撤销操作,即是使⽤了备忘录模式,系统可以保存有限次数的⽂件状态,⽤户可以进⾏上⼏个状态的恢复,也就是⽤到了
备忘录模式。
20.状态模式
状态模式是允许对象在内部状态发⽣改变时改变它的⾏为。对象具有多种状态,且每种状态具有特定的⾏为。在⽹站的积分系统中,⽤户具有不同的积分,也就对应了不同的状态;还有QQ的⽤户状态有⼏种状态,在线、隐⾝、忙碌等,每个状态对应不同的操作,⽽且你的好友也能看到你的状态。
21.访问者模式
访问者模式主要是将数据结构与数据操作分离。在被访问的类⾥⾯加⼀个对外提供接待访问者的接⼝,访问者封装了对被访问者结构的⼀些杂乱操作,解耦结构与算法,同时具有优秀的扩展性。通俗
来讲就是⼀种分离对象数据结构与⾏为的⽅法,通过这种分离,可达到为⼀个被访问者动态添加新的操作⽽⽆需做其它的修改的效果。访问者模式的优点是增加操作很容易,因为增加操作意味着增加新的访问者。访问者模式将有关⾏为集中到⼀个访问者对象中,其改变不影响系统数据结构。
22.中介者模式
中介者模式是⽤⼀个中介对象来封装⼀系列的对象交互,中介者使各对象不需要显式地相互引⽤,从⽽使其耦合松散,⽽且可以独⽴地改变它们之间的交互。例如,MVC模式中control就是model和view的中介者。与适配器区别在于,适配器是为了兼容不同的接⼝,⽽中介者是为了将显⽰和操作分离。
23.解释器模式
解释器模式是给定⼀个语⾔,定义它的⽂法表⽰,并定义⼀个解释器,这个解释器使⽤该标识来解释语⾔中的句⼦,基本也就⽤在这个范围内,适⽤⾯较窄,例如:正则表达式的解释等。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。