1 万字彻底吃透23种常见的设计模式(完结)
我们平时使用的每一个技术栈的原理或者源码或多或少都与设计模式有联系,也可以这么说,只有更好的掌握设计模式,我们编写的代码才能更规范、更简洁,效率更高。
其次,设计模式是前辈对过往经验反复总结而成的,那站在巨人的肩膀上,吸收他们的经验教训,我们的编码之路才会走的更长久。
同时,在面试中设计模式也是加分项,如果你能将设计模式跟面试官娓娓道来,面试官肯定会对你刮目相看。工作中,拥有良好的设计模式思想,对于项目的开发也会有很大的帮助。
接下来,跟着二哥一起来看看我们需要了解的设计模式都有哪些吧~
前言
总体来说,设计模式分为三大类:
*创建型模式:*工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
*结构型模式:*适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
*行为型模式:*策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
单例模式
概念
确保某一个类只有一个实例,且能自行实例化并向整个系统提供这个实例。
使用场景
- 要求生成唯一序列号的环境;
- 在整个项目中需要一个共享访问点或共享数据,例如一个 Web 页面上的计数器,可以不用把每次刷新都记录到数据库中,使用单例模式保持计数器的值,并确保是线程安全的;
- 创建一个对象需要消耗的资源过多,如要访问 IO 和数据库等资源;
- 需要定义大量的静态常量和静态方法(如工具类)的环境,可以采用单例模式(当然,也可以直接声明为 static 的方式)。
代码示例
线程安全:
public class Singleton {
private static final Singleton singleton = new Singleton();
//限制产生多个对象
private Singleton(){
}
//通过该方法获得实例对象
public static Singleton getSingleton(){
return singleton;
}
//类中其他方法,尽量是 static
public static void doSomething(){
}
}
线程不安全:
public class Singleton {
private static Singleton singleton = null;
//限制产生多个对象
private Singleton(){
}
//通过该方法获得实例对象
public static Singleton getSingleton(){
if(singleton == null){
singleton = new Singleton();
}
return singleton;
}
}
针对线程不安全:
可以在 getSingleton 方法前加 synchronized 关键字,也可以在 getSingleton 方法内增加 synchronized 来实现。
工厂模式
概念
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
使用场景
jdbc 连接数据库,硬件访问,降低对象的产生和销毁
结构
*简单工厂模式:*一个模块仅需要一个工厂类,没有必要把它产生出来,使用静态的方法
*多个工厂类:*每个人种(具体的产品类)都对应了一个创建者,每个创建者独立负责创建对应的产品对象,非常符合单一职责原则
*代替单例模式:*单例模式的核心要求就是在内存中只有一个对象,通过工厂方法模式也可以只在内存中生产一个对象
*延迟初始化:*ProductFactory 负责产品类对象的创建工作,并且通过 prMap 变量产生一个缓存,对需要再次被重用的对象保留
代码示例
Product 负责定义产品的共性,实现对事物最抽象的定义;
Creator 为抽象创建类,也就是抽象工厂,具体如何创建产品类由具体的实现工厂 ConcreteCreator 完成。
public class ConcreteCreator extends Creator {
public T createProduct(Class c){
Product product=null;
try {
product =
(Product)Class.forName(c.getName()).newInstance();
} catch (Exception e) {
//异常处理
}
return (T)product;
}
}
抽象工厂模式
概念
为创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们的具体类。
使用场景
一个对象族(或是一组没有任何关系的对象)都有相同的约束。涉及不同操作系统的时候,就可以考虑使用抽象工厂模式。
代码示例
public abstract class AbstractCreator {
//创建 A 产品家族
public abstract AbstractProductA createProductA();
//创建 B 产品家族
public abstract AbstractProductB createProductB();
}
模板方法模式
概念
定义一个操作中算法的框架,将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
使用场景
- 多个子类有公有的方法,并且逻辑基本相同时。
- 重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现。
- 重构时,模板方法模式是一个经常使用的模式,把相同的代码抽取到父类中,然后通过钩子函数(见“模板方法模式的扩展”)约束其行为。
结构
抽象模板:AbstractClass 为抽象模板,它的方法分为两类:
1、基本方法:也叫做基本操作,是由子类实现的方法,并且在模板方法被调用。
2、模板方法:可以有一个或几个,一般是一个具体方法,也就是一个框架,实现对基本方法的调度,完成固定的逻辑。
注意: 为了防止恶意操作,一般模板方法都会加上 final 关键字,不允许被覆写。
*具体模板:*实现父类所定义的一个或多个抽象方法,也就是父类定义的基本方法在子类中得以实现。
代码示例
package templateMethod;
public class TemplateMethodPattern
{
public static void main(String[] args)
{
AbstractClass tm=new ConcreteClass();
tm.TemplateMethod();
}
}
//抽象类
abstract class AbstractClass
{
public void TemplateMethod() //模板方法
{
SpecificMethod();
abstractMethod1();
abstractMethod2();
}
public void SpecificMethod() //具体方法
{
System.out.println("抽象类中的具体方法被调用...");
}
public abstract void abstractMethod1(); //抽象方法1
public abstract void abstractMethod2(); //抽象方法2
}
//具体子类
class ConcreteClass extends AbstractClass
{
public void abstractMethod1()
{
System.out.println("抽象方法1的实现被调用...");
}
public void abstractMethod2()
{
System.out.println("抽象方法2的实现被调用...");
}
}
建造者模式
概念
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
使用场景
- 相同的方法,不同的执行顺序,产生不同的事件结果时,可以采用建造者模式。
- 多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时,则可以使用该模式。
- 产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候使用建造者模式非常合适。
结构
*Product 产品类:*通常实现了模板方法,也就是有模板方法和基本方法。
*Builder 抽象建造者:*规范产品的组建,一般是由子类实现。
*ConcreteBuilder 具体建造者:*实现抽象类定义的所有方法,并且返回一个组建好的对象。
*Director 导演类:*负责安排已有模块的顺序,然后告诉 Builder 开始建造
代码示例
public class ConcreteProduct extends Builder {
private Product product = new Product();
//设置产品零件
public void setPart(){
/*
* 产品类内的逻辑处理
*/
}
//组建一个产品
public ...未能定位到原文的划线
企业级Agent工作流编排项目PaiFlow
Vibe Coding版本的PaiAgent
派聪明RAG AI知识库Java版本+Go版本
微服务 PmHub、技术派、MYDB
求职派JobClaw(OpenClaw/Hermes架构
PaiCLI(类似Claude Code的Agent
派简历(代码已完成)
等实战项目。
1. 微信扫右侧的优惠券加入知识星球
2. 解锁星球的实战项目教程和源码: 项目源码+教程获取
真诚点赞 诚不我欺
回复