Java常见的23种设计模式,详细讲解!
⼀、什么是设计模式:
设计模式是⼀套经过反复使⽤的代码设计经验,⽬的是为了重⽤代码、让代码更容易被他⼈理解、保证代码可靠性。 设计模式于⼰于⼈于系统都是多赢的,它使得代码编写真正⼯程化,它是软件⼯程的基⽯,如同⼤厦的⼀块块砖⽯⼀样。项⽬中合理的运⽤设计模式可以完美的解决很多问题,每种模式在现实中都有相应的原理来与之对应,每种模式描述了⼀个在我们周围不断重复发⽣的问题,以及该问题的核⼼解决⽅案,这也是它能被⼴泛应⽤的原因。
J ava全套视频推荐:全新的Java300集_java零基础⼩⽩⾃学Java必备优质教程
本视频是Java300集2022版最新版,本套教程专门为零基础学员⽽制,适合准备⼊⾏Java开发的零基础学员,视频中穿插多个实战项⽬。每⼀个知识点都讲解的通俗易懂,由浅⼊深。不仅适⽤于零基础的初学者,有经验的程序员也可做巩固学习。
⼆、Java的23种设计模式:
接下来我们详细介绍Java中23种设计模式的概念,应⽤场景等情况,并结合他们的特点及设计模式的原则进⾏分析!
1、创建型-⼯⼚⽅法模式:
⼯⼚⽅法模式分为三种:
(1)简单⼯⼚模式:java零基础该怎么学
建⽴⼀个⼯⼚类,并定义⼀个接⼝对实现了同⼀接⼝的产品类进⾏创建。⾸先看下关系图:
(2)⼯⼚⽅法模式:
⼯⼚⽅法模式是对简单⼯⼚模式的改进,简单⼯⼚的缺陷在于不符合“开闭原则”,每次添加新产品类就需要修改⼯⼚类,不利于系统的扩展维护。⽽⼯⼚⽅法将⼯⼚抽象化,并定义⼀个创建对象的接⼝。
每增加新产品,只需增加该产品以及对应的具体实现⼯⼚类,由具体⼯⼚类决定要实例化的产品是哪个,将对象的创建与实例化延迟到⼦类,这样⼯⼚的设计就符合“开闭原则”了,扩展时不必去修改原来的代码。
UML关系图如下:
(3)静态⼯⼚⽅法模式:
静态⼯⼚模式是将⼯⼚⽅法模式⾥的⽅法置为静态的,不需要创建实例,直接调⽤即可。
2、创建型-抽象⼯⼚模式:
抽象⼯⼚模式主要⽤于创建相关对象的家族。当⼀个产品族中需要被设计在⼀起⼯作时,通过抽象⼯⼚模式,能够保证客户端始终只使⽤同⼀个产品族中的对象;并且通过隔离具体类的⽣成,使得客户端不需要明确指定具体⽣成类;所有的具体⼯⼚都实现了抽象⼯⼚中定义的公共接⼝,因此只需要改变具体⼯⼚的实例,就可以在某种程度上改变整个软件系统的⾏为。
但该模式的缺点在于添加新的⾏为时⽐较⿇烦,如果需要添加⼀个新产品族对象时,需要更改接⼝及其下所有⼦类,这必然会带来很⼤的⿇烦。
UML结构图如下:
3、创建型-建造者模式:
建造者模式将复杂产品的创建步骤分解在在不同的⽅法中,使得创建过程更加清晰,从⽽更精确控制复杂对象的产⽣过程;通过隔离复杂对象的构建与使⽤,也就是将产品的创建与产品本⾝分离开来,使得同样的构建过程可以创建不同的对象;
并且每个具体建造者都相互独⽴,因此可以很⽅便地替换具体建造者或增加新的具体建造者,⽤户使⽤不同的具体建造者即可得到不同的产品对象。
4、创建型-单例模式:
单例模式可以确保系统中某个类只有⼀个实例,该类⾃⾏实例化并向整个系统提供这个实例的公共访问点,除了该公共访问点,不能通过其他途径访问该实例。
单例模式的优点在于:系统中只存在⼀个共⽤的实例对象,⽆需频繁创建和销毁对象,节约了系统资源,提⾼系统的性能;可以严格控制客户怎么样以及何时访问单例对象。
5、创建型-原型模式:
原型模式也是⽤于对象的创建,通过将⼀个对象作为原型,对其进⾏复制克隆,产⽣⼀个与源对象类似的新对象。
UML类图如下:
在 Java 中,原型模式的核⼼是就是原型类 Prototype,Prototype 类需要具备以下两个条件:实现 Cloneable 接⼝;重写 Object 类中的 clone() ⽅法,⽤于返回对象的拷贝。
Object 类中的 clone() ⽅法默认是浅拷贝,如果想要深拷贝对象,则需要在 clone() ⽅法中⾃定义⾃⼰的复制逻辑:
浅复制:将⼀个对象复制后,基本数据类型的变量会重新创建,⽽引⽤类型指向的还是原对象所指向的内存地址。
深复制:将⼀个对象复制后,不论是基本数据类型还有引⽤类型,都是重新创建的。
上⾯我们介绍了5种创建型模式,下⾯我们就开始介绍下7种结构型模式:适配器模式、装饰模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
6、结构型-适配器模式:
适配器模式主要⽤于将⼀个类或者接⼝转化成客户端希望的格式,使得原本不兼容的类可以在⼀起⼯作,将⽬标类和适配者类解耦;同时也符合“开闭原则”,可以在不修改原代码的基础上增加新的适配器类;将具体的实现封装在适配者类中,对于客户端类来说是透明的,⽽且提⾼了适配者的复⽤性,但是缺点在于更换适配器的实现过程⽐较复杂。
所以,适配器模式⽐较适合以下场景:
(1)系统需要使⽤现有的类,⽽这些类的接⼝不符合系统的接⼝。
(2)使⽤第三⽅组件,组件接⼝定义和⾃⼰定义的不同,不希望修改⾃⼰的接⼝,但是要使⽤第三⽅组件接⼝的功能。
7、结构型-装饰器模式:
装饰器模式可以动态给对象添加⼀些额外的职责从⽽实现功能的拓展,在运⾏时选择不同的装饰器,
从⽽实现不同的⾏为;⽐使⽤继承更加灵活,通过对不同的装饰类进⾏排列组合,创造出很多不同⾏为,得到功能更为强⼤的对象;符合“开闭原则”,被装饰类与装饰类独⽴变化,⽤户可以根据需要增加新的装饰类和被装饰类,在使⽤时再对其进⾏组合,原有代码⽆须改变。
但是装饰器模式也存在缺点,⾸先会产⽣很多的⼩对象,增加了系统的复杂性,第⼆是排错⽐较困难,对于多次装饰的对象,调试时寻错误可能需要逐级排查,较为烦琐。
8、结构型-代理模式:
代理模式的设计动机是通过代理对象来访问真实对象,通过建⽴⼀个对象代理类,由代理对象控制原对象的引⽤,从⽽实现对真实对象的操作。
在代理模式中,代理对象主要起到⼀个中介的作⽤,⽤于协调与连接调⽤者(即客户端)和被调⽤者(即⽬标对象),在⼀定程度上降低了系统的耦合度,同时也保护了⽬标对象。但缺点是在调⽤者与被调⽤者之间增加了代理对象,可能会造成请求的处理速度变慢。
9、结构型-桥接模式:
桥接模式将系统的抽象部分与实现部分分离解耦,使他们可以独⽴的变化。为了达到让抽象部分和实现部分独⽴变化的⽬的,桥接模式使⽤组合关系来代替继承关系,抽象部分拥有实现部分的接⼝对象,
从⽽能够通过这个接⼝对象来调⽤具体实现部分的功能。
也就是说,桥接模式中的桥接是⼀个单⽅向的关系,只能够抽象部分去使⽤实现部分的对象,⽽不能反过来。
桥接模式符合“开闭原则”,提⾼了系统的可拓展性,在两个变化维度中任意扩展⼀个维度,都不需要修改原来的系统;并且实现细节对客户不透明,可以隐藏实现细节。但是由于聚合关系建⽴在抽象层,要求开发者针对抽象进⾏编程,这增加系统的理解和设计难度。
就像在Java中我们使⽤ JDBC 连接数据库时,在各个数据库之间进⾏切换,基本不需要动太多的代码,原因就是使⽤了桥接模式,JDBC 提供统⼀接⼝,每个数据库提供各⾃的实现,然后由桥接类创建⼀个连接数据库的驱动,使⽤某⼀个数据库的时候只需要切换⼀下就⾏。
10、结构型-外观模式:
外观模式通过对客户端提供⼀个统⼀的接⼝,⽤于访问⼦系统中的⼀接⼝。使⽤外观模式有以下⼏点好处:
(1)更加易⽤:使得⼦系统更加易⽤,客户端不再需要了解⼦系统内部的实现,也不需要跟众多⼦系统内部的模块进⾏交互,只需要跟外观类交互就可以了;
(2)松散耦合:将客户端与⼦系统解耦,让⼦系统内部的模块能更容易扩展和维护。
(3)更好的划分访问层次:通过合理使⽤ Facade,可以更好地划分访问的层次,有些⽅法是对系统外的,有些⽅法是系统内部使⽤的。把需要暴露给外部的功能集中到门⾯中,这样既⽅便客户端使⽤,也很好地隐藏了内部的细节。
但是如果外观模式对⼦系统类做太多的限制则减少了可变性和灵活性,所以外观模式适⽤于为复杂⼦系统提供⼀个简单接⼝,提⾼系统的易⽤性场景 以及 引⼊外观模式将⼦系统与客户端进⾏解耦,提⾼⼦系统的独⽴性和可移植性。
11、结构型-组合模式:
组合模式将叶⼦对象和容器对象进⾏递归组合,形成树形结构以表⽰“部分-整体”的层次结构,使得⽤户对单个对象和组合对象的使⽤具有⼀致性,能够像处理叶⼦对象⼀样来处理组合对象,⽆需进⾏区分,从⽽使⽤户程序能够与复杂元素的内部结构进⾏解耦。
组合模式最关键的地⽅是叶⼦对象和组合对象实现了相同的抽象构建类,它既可表⽰叶⼦对象,也可表⽰容器对象,客户仅仅需要针对这个抽象构建类进⾏编程,这就是组合模式能够将叶⼦节点和对象节点进⾏⼀致处理的原因。
12、结构型-享元模式:
享元模式通过共享技术有效地⽀持细粒度、状态变化⼩的对象复⽤,当系统中存在有多个相同的对象,那么只共享⼀份,不必每个都去实例化⼀个对象,极⼤地减少系统中对象的数量,从⽽节省资源。
享元模式的核⼼是享元⼯⼚类,享元⼯⼚类维护了⼀个对象存储池,当客户端需要对象时,⾸先从享元池中获取,如果享元池中存在对象实例则直接返回,如果享元池中不存在,则创建⼀个新的享元对象实例返回给⽤户,并在享元池中保存该新增对象,这点有些单例的意思。
⼯⼚类通常会使⽤集合类型来保存对象,如 HashMap、Hashtable、Vector 等等,在 Java 中,数据库连接池、线程池等都是⽤享元模式的应⽤。
Java 中,String 类型就是使⽤享元模式,String 对象是 final 类型,对象⼀旦创建就不可改变。⽽ Java 的字符串常量都是存在字符串常量池中的,JVM 会确保⼀个字符串常量在常量池中只有⼀个拷贝。
⽽且提到共享池,我们也很容易联想到 Java ⾥⾯的JDBC连接池,通过连接池的管理,实现了数据库连接的共享,不需要每⼀次都重新创建连接,节省了数据库重新创建的开销,提升了系统的性能!
前⾯我们介绍了7种结构型设计模式,接下来我们介绍⼀下11种⾏为型设计模式:策略模式、模板⽅法模式、观察者模式、迭代⼦模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
13、⾏为型-策略模式:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论