Java23种开发设计模式
设计模式的三个分类:
创建型模式:对象实例化的模式,创建型模式⽤于解耦对象的实例化过程。
结构型模式:把类或对象结合在⼀起形成⼀个更⼤的结构。
⾏为型模式:类和对象如何交互,及划分责任和算法。
----------------------------------------------------------------------------------------------------
设计模式的六⼤原则:
1、开闭原则(Open Close Principle)
开闭原则就是说对扩展开放,对修改关闭。在程序需要进⾏拓展的时候,不能去修改原有的代码,实现⼀个热插拔的效果。所以⼀句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使⽤接⼝和抽象类,后⾯的具体设计中我们会提到这点。
2、⾥⽒代换原则(Liskov Substitution Principle)
⾥⽒代换原则(Liskov Substitution Principle LSP)⾯向对象设计的基本原则之⼀。 ⾥⽒代换原则中说,任何基类可以出现的地⽅,⼦类⼀定可以出现。 LSP是继承复⽤的基⽯,只有当衍⽣类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复⽤,⽽衍⽣类也能够在基类的基础上增加新的⾏为。⾥⽒代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。⽽基类与⼦类的继承关系就是抽象化的具体实现,所以⾥⽒代换原则是对实现抽象化的具体步骤的规范。—— From Baidu 百科
3、依赖倒转原则(Dependence Inversion Principle)
这个是开闭原则的基础,具体内容:真对接⼝编程,依赖于抽象⽽不依赖于具体。
单例模式的几种实现方式4、接⼝隔离原则(Interface Segregation Principle)
这个原则的意思是:使⽤多个隔离的接⼝,⽐使⽤单个接⼝要好。还是⼀个降低类之间的耦合度的意思,从这⼉我们看出,其实设计模式就是⼀个软件的设计思想,从⼤型软件架构出发,为了升级和维护⽅便。所以上⽂中多次出现:降低依赖,降低耦合。
5、迪⽶特法则(最少知道原则)(Demeter Principle)
为什么叫最少知道原则,就是说:⼀个实体应当尽量少的与其他实体之间发⽣相互作⽤,使得系统功能模块相对独⽴。
6、合成复⽤原则(Composite Reuse Principle)
原则是尽量使⽤合成/聚合的⽅式,⽽不是使⽤继承。
----------------------------------------------------------------------------------------------------
23种设计模式:
单例模式:某个类只能有⼀个实例,提供⼀个全局的访问点。
简单⼯⼚:⼀个⼯⼚类根据传⼊的参量决定创建出那⼀种产品类的实例。
⼯⼚⽅法:定义⼀个创建对象的接⼝,让⼦类决定实例化那个类。
抽象⼯⼚:创建相关或依赖对象的家族,⽽⽆需明确指定具体类。
建造者模式:封装⼀个复杂对象的构建过程,并可以按步骤构造。
原型模式:通过复制现有的实例来创建新的实例。
适配器模式:将⼀个类的⽅法接⼝转换成客户希望的另外⼀个接⼝。
组合模式:将对象组合成树形结构以表⽰“”部分-整体“”的层次结构。
装饰模式:动态的给对象添加新的功能。
代理模式:为其他对象提供⼀个代理以便控制这个对象的访问。
亨元(蝇量)模式:通过共享技术来有效的⽀持⼤量细粒度的对象。
外观模式:对外提供⼀个统⼀的⽅法,来访问⼦系统中的⼀接⼝。
桥接模式:将抽象部分和它的实现部分分离,使它们都可以独⽴的变化。
模板模式:定义⼀个算法结构,⽽将⼀些步骤延迟到⼦类实现。
解释器模式:给定⼀个语⾔,定义它的⽂法的⼀种表⽰,并定义⼀个解释器。
策略模式:定义⼀系列算法,把他们封装起来,并且使它们可以相互替换。
状态模式:允许⼀个对象在其对象内部状态改变时改变它的⾏为。
观察者模式:对象间的⼀对多的依赖关系。
备忘录模式:在不破坏封装的前提下,保持对象的内部状态。
中介者模式:⽤⼀个中介对象来封装⼀系列的对象交互。
命令模式:将命令请求封装为⼀个对象,使得可以⽤不同的请求来进⾏参数化。
访问者模式:在不改变数据结构的前提下,增加作⽤于⼀组对象元素的新功能。
责任链模式:将请求的发送者和接收者解耦,使的多个对象都有处理这个请求的机会。
迭代器模式:⼀种遍历访问聚合对象中各个元素的⽅法,不暴露该对象的内部结构。
1.单例模式
单例模式,它的定义就是确保某⼀个类只有⼀个实例,并且提供⼀个全局访问点。
单例模式具备典型的3个特点:1、只有⼀个实例。 2、⾃我实例化。 3、提供全局访问点。
因此当系统中只需要⼀个实例对象或者系统中只允许⼀个公共访问点,除了这个公共访问点外,不能通过其他访问点访问该实例时,可以使⽤单例模式。
单例模式的主要优点就是节约系统资源、提⾼了系统效率,同时也能够严格控制客户对它的访问。也许就是因为系统中只有⼀个实例,这样就导致了单例类的职责过重,违背了“单⼀职责原则”,同时也没有抽象类,所以扩展起来有⼀定的困难。其UML结构图⾮常简单,就只有⼀个类,如下图:
2.⼯⼚⽅法模式
作为抽象⼯⼚模式的孪⽣兄弟,⼯⼚⽅法模式定义了⼀个创建对象的接⼝,但由⼦类决定要实例化的类是哪⼀个,也就是说⼯⼚⽅法模式让实例化推迟到⼦类。
⼯⼚⽅法模式⾮常符合“开闭原则”,当需要增加⼀个新的产品时,我们只需要增加⼀个具体的产品类和与之对应的具体⼯⼚即可,⽆须修改原有系统。同时在⼯⼚⽅法模式中⽤户只需要知道⽣产产品的具体⼯⼚即可,⽆须关系产品的创建过程,甚⾄连具体的产品类名称都不需要知道。虽然他很好的符合了“开闭原则”,但是由于每新增⼀个新产品时就需要增加两个类,这样势必会导致系统的复杂度增加。其UML结构图:
3.抽象⼯⼚模式
所谓抽象⼯⼚模式就是提供⼀个接⼝,⽤于创建相关或者依赖对象的家族,⽽不需要明确指定具体类。他允许客户端使⽤抽象的接⼝来创建⼀组相关的产品,⽽不需要关系实际产出的具体产品是什么。这样⼀来,客户就可以从具体的产品中被解耦。它的优点是隔离了具体类的⽣成,使得客户端不需要知道什么被创建了,⽽缺点就在于新增新的⾏为会⽐较⿇烦,因为当添加⼀个新的产品对象时,需要更加需要更改接⼝及其下所有⼦类。其UML结构图如下:
4.建造者模式
对于建造者模式⽽已,它主要是将⼀个复杂对象的构建与表⽰分离,使得同样的构建过程可以创建不同的表⽰。适⽤于那些产品对象的内部结构⽐较复杂。
建造者模式将复杂产品的构建过程封装分解在不同的⽅法中,使得创建过程⾮常清晰,能够让我们更加精确的控制复杂产品对象的创建过程,同时它隔离了复杂产品对象的创建和使⽤,使得相同的创建
过程能够创建不同的产品。但是如果某个产品的内部结构过于复杂,将会导致整个系统变得⾮常庞⼤,不利于控制,同时若⼏个产品之间存在较⼤的差异,则不适⽤建造者模式,毕竟这个世界上存在相同点⼤的两个产品并不是很多,所以它的使⽤范围有限。其UML结构图:
5.原型模式
在我们应⽤程序可能有某些对象的结构⽐较复杂,但是我们⼜需要频繁的使⽤它们,如果这个时候我们来不断的新建这个对象势必会⼤⼤损耗系统内存的,这个时候我们需要使⽤原型模式来对这个结构复杂⼜要频繁使⽤的对象进⾏克隆。所以原型模式就是⽤原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。
它主要应⽤与那些创建新对象的成本过⼤时。它的主要优点就是简化了新对象的创建过程,提⾼了效率,同时原型模式提供了简化的创建结构。UML结构图:
模式结构
原型模式包含如下⾓⾊:
Prototype:抽象原型类
ConcretePrototype:具体原型类
Client:客户类
6.适配器模式
在我们的应⽤程序中我们可能需要将两个不同接⼝的类来进⾏通信,在不修改这两个的前提下我们可能会需要某个中间件来完成这个衔接的过程。这个中间件就是适配器。所谓适配器模式就是将⼀个类的接⼝,转换成客户期望的另⼀个接⼝。它可以让原本两个不兼容的接⼝能够⽆缝完成对接。
作为中间件的适配器将⽬标类和适配者解耦,增加了类的透明性和可复⽤性。
适配器模式包含如下⾓⾊:
Target:⽬标抽象类
Adapter:适配器类
Adaptee:适配者类
Client:客户类
7.桥接模式
如果说某个系统能够从多个⾓度来进⾏分类,且每⼀种分类都可能会变化,那么我们需要做的就是讲这多个⾓度分离出来,使得他们能独⽴变化,减少他们之间的耦合,这个分离过程就使⽤了桥接模式。所谓桥接模式就是讲抽象部分和实现部分隔离开来,使得他们能够独⽴变化。
桥接模式将继承关系转化成关联关系,封装了变化,完成了解耦,减少了系统中类的数量,也减少了代码量。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论