23种设计模式知识点详细解析(含PDF学习资料)

前言:

Java 中一般认为有 23 种设计模式,我们不需要所有的都会,但是其中常用的几种设计模式应该去掌握。下面列出了所有的设计模式。虽然不需要全会,当然能掌握的越多越好。

总体来说设计模式分为三大类:

创建型模式共5种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

结构型模式共7种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

行为型模式共11种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

打开网易新闻 查看精彩图片

由于篇幅的限制,没有办法把23种设计模式全部详细的分享给大家,但是整理成了Pdf资料可以分享,关注我的供种号(Java周某人)即可
一.单例模式(Singleton Pattern)

定义:

Ensure a class has only one instance, and provide a global point of accessto it.(确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。)

通用代码(是线程安全的)

打开网易新闻 查看精彩图片

使用场景:

● 要求生成唯一序列号的环境;

● 在整个项目中需要一个共享访问点或共享数据,例如一个 Web 页面上的计数器,可以不用把每次刷新都记录到数据库中,使用单例模式保持计数器的值,并确保是线程安全的;

● 创建一个对象需要消耗的资源过多,如要访问 IO 和数据库等资源;

● 需要定义大量的静态常量和静态方法(如工具类)的环境,可以采用单例模式(当然,也可以直接声明为 static 的方式)。

线程不安全实例:

打开网易新闻 查看精彩图片
打开网易新闻 查看精彩图片

解决办法:

在 getSingleton 方法前加 synchronized 关键字,也可以在 getSingleton 方法内增加 synchronized 来实现。最优的办法是如通用代码那样写。

二.工厂模式

定义:

Define an interface for creating an object,but let subclasses decide whichclass to instantiate.Factory Method lets a class defer instantiation to subclasses.(定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。)

Product 为抽象产品类负责定义产品的共性,实现对事物最抽象的定义;Creator 为抽象创建类,也就是抽象工厂,具体如何创建产品类是由具体的实现工厂 ConcreteCreator 完成的。

具体工厂类代码:

打开网易新闻 查看精彩图片

简单工厂模式:

一个模块仅需要一个工厂类,没有必要把它产生出来,使用静态的方法

多个工厂类:

每个人种(具体的产品类)都对应了一个创建者,每个创建者独立负责创建对应的产品对象,非常符合单一职责原则

代替单例模式:

单例模式的核心要求就是在内存中只有一个对象,通过工厂方法模式也可以只在内存中生产一个对象

延迟初始化:

ProductFactory 负责产品类对象的创建工作,并且通过 prMap 变量产生一个缓存,对需要再次被重用的对象保留

使用场景:jdbc 连接数据库,硬件访问,降低对象的产生和销毁

三.抽象工厂模式(Abstract FactoryPattern)

定义:

Provide an interface for creating families of related or dependent objectswithout specifying their concrete classes.(为创建一组相关或相互依赖的对象提供 一个接口,而且无须指定它们的具体类。)

抽象工厂类代码:

打开网易新闻 查看精彩图片

使用场景:

一个对象族(或是一组没有任何关系的对象)都有相同的约束。

涉及不同操作系统的时候,都可以考虑使用抽象工厂模式

四.模板方法模式(Template MethodPattern)

定义:

Define the skeleton of an algorithm in an operation,deferring some stepstosubclasses.Template Method lets subclasses redefine certain steps of analgorithm without changing the algorithm's structure.(定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。)

AbstractClass 叫做抽象模板,它的方法分为两类:

● 基本方法

基本方法也叫做基本操作,是由子类实现的方法,并且在模板方法被调用。

● 模板方法

可以有一个或几个,一般是一个具体方法,也就是一个框架,实现对基本方法的调度,完成固定的逻辑。注意: 为了防止恶意的操作,一般模板方法都加上 final 关键字,不允许被覆写。

具体模板:

ConcreteClass1 和 ConcreteClass2 属于具体模板,实现父类所定义的一个或多个抽象方法,也就是父类定义的基本方法在子类中得以实现

使用场景:

● 多个子类有公有的方法,并且逻辑基本相同时。

● 重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由

各个子类实现。

● 重构时,模板方法模式是一个经常使用的模式,把相同的代码抽取到父类中,然后通过钩子函数(见“模板方法模式的扩展”)约束其行为。

五:建造者模式(Builder Pattern)

定义:

Separate the construction of a complex object from its representation sothat the same construction process can create different representations.(将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。)

● Product 产品类

通常是实现了模板方法模式,也就是有模板方法和基本方法,例子中的

BenzModel 和 BMWModel 就属于产品类。

● Builder 抽象建造者

规范产品的组建,一般是由子类实现。例子中的 CarBuilder 就属于抽象建造者。

● ConcreteBuilder 具体建造者

实现抽象类定义的所有方法,并且返回一个组建好的对象。例子中的 BenzBuilder和 BMWBuilder 就属于具体建造者。

● Director 导演类

负责安排已有模块的顺序,然后告诉 Builder 开始建造

使用场景:

● 相同的方法,不同的执行顺序,产生不同的事件结果时,可以采用建造者模式。

● 多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时,则可以使用该模式。

● 产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候使用建造者模式非常合适。

建造者模式与工厂模式的不同:

建造者模式最主要的功能是基本方法的调用顺序安排,这些基本方法已经实现了,顺序不同产生的对象也不同;工厂方法则重点是创建,创建零件是它的主要职责,组装顺序则不是它关心的。

总结:

由于篇幅的限制,没有办法把23种设计模式全部详细的分享给大家,但是整理成了Pdf资料可以分享给大家,有需要此PDF文档资料的可以找我领取,希望可以帮助到大家学习。

领取方式:关注我的供种号(Java周某人)即可

打开网易新闻 查看精彩图片
打开网易新闻 查看精彩图片