2025-09-25
组合模式(Composite Pattern)是一种结构型设计模式,它允许将对象组合成树形结构,并用统一的方式处理单个对象和对象组合。这种模式让客户端可以忽略单个对象和组合对象的差异,从而对它们进行一致操作。
简单来说,组合模式就像 “文件系统”—— 文件和文件夹可以被统一对待,文件夹中可以包含文件或其他文件夹,形成树形结构,用户可以对任意节点(文件或文...
阅读全文
2025-09-25
享元模式(Flyweight Pattern)是一种结构型设计模式,它通过共享已存在的对象来减少内存占用和对象创建开销,特别适合处理大量相似对象的场景。
核心思想是:将对象的属性分为内部状态(可共享,不随环境变化)和外部状态(不可共享,随环境变化),通过共享内部状态相同的对象,来减少系统中对象的数量。
享元模式的UML类图如下:
从图中可以看出
享元工...
阅读全文
2025-09-25
装饰模式(Decorator Pattern)是一种结构型设计模式,它允许在不改变原有对象结构的情况下,动态地给对象添加新功能。装饰模式通过创建 “装饰器” 类来包裹原始对象,从而在保持接口一致性的同时,实现功能的扩展。
打个比方,装饰模式就像 “手机壳”—— 手机本身的功能不变,但加上不同的手机壳(装饰器)可以获得防摔、美观、无线充电等额外功能,且可以...
阅读全文
2025-09-25
外观模式(Facade Pattern)是一种结构型设计模式,它为复杂子系统提供一个统一的简化接口,客户端通过这个接口与子系统交互,而无需直接操作子系统中的多个组件。
简单来说,外观模式就像 “前台服务员”—— 当你去餐厅吃饭时,不需要直接和厨房、吧台、保洁等多个部门打交道,只需告诉前台服务员你的需求,由他协调协调内部各部门完成工作。
其UML类图如下:...
阅读全文
2025-09-25
适配器模式(Adapter Pattern)的定义是:它一种结构型设计模式,它的核心作用是将一个类的接口转换成客户端期望的另一个接口,使得原本因接口不兼容而无法一起工作的类能够协同工作。
用一个现实生活中的例子来比喻,我们家里的插座是三项的,但是我们的插头是两项的,这时候可以用一个转换插座把三项的转换成两项的。又比如,我们家里的电源都是220V的,那我要...
阅读全文
2025-09-24
代理模式是一种结构型设计模式,它通过引入“代理对象”来控制原始对象的访问。这个代理对象与我们要访问的原始对象实现相同的接口,然后客户端就可以通过代理对象访问原始对象。那么我们就可以实现在不修改原始对象电的情况下增加额外的功能。比如,实现权限控制、日志记录或者延迟加载等。下面是一个代理模式的UML类图:
在上面的类图中:
Subject:是一个抽象主题,它定...
阅读全文
2025-09-24
我们在工厂实践中会遇到一种场景,那就是要构造的对象很复杂,可能包含多个组成部分,但是由这些不同的组成部分形成的对象最终的表现形式可能是不同的。此时我们就可以用到生成器模式。
生成器模式的定义是:将复杂对象的构建过程与表示分离,使得同样的构建过程可以创建不同的表示。
其核心要解决的问题就是:当一个对象包含多个组成部分,且构建过程复杂(如需要分步骤构建、存在...
阅读全文
2025-09-24
面向对象的编程中,创建一个对象是要开销资源的,比如java中通过new关键字来创建对象。但是有的时候,我们要创建大量的对象而这些对象的大部分属性都是相同只有部分属性会有变化。此时还使用new来创建对象,其开销的资源就比较大了,而且效率不高。于是我们就可以用到原型模式。
原型模式的定义是:通过编程语言(比如Java或C++)等提供的对象克隆(复制)方法来创建对...
阅读全文
2025-09-24
工厂模式是为了把对象的内容耦合进行解耦,变成一种更好的数据耦合的方式,最终的目的是还是为了解耦。工厂模式的定义是:定义一个用于创建对象的接口,然后让子类决定实例化哪一个类。这样的目的是让一个类的实例化延迟到子类中完成。
工厂模式的UML类图如下:
举一个实际中应用的例子,比如我们的程序中需要一个日志工具,记录日志的方式有很多种,可能初期的时候我们可能只是在...
阅读全文
2025-09-24
介绍设计模式的文章其实很多了,今天开始我打算把23个设计模式用自己的方式重新梳理一遍。以下是最简单也是比较常用的单例模式。
单例模式的定义是:确保一个类,只有一个实例,并提供一个访问它的全局访问点。
我们来用一个UML图示表示它,如下:
这个单例模式在我们日常的编程中应用还是比较多的。比如,我们在做各类基于数据库的这种信息系统时,要不停的访问数据库存取...
阅读全文