一、创建型设计模式
对类的现实化进行了抽象,功能是类的创建。
- 工厂方法模式(Factory Method Pattern):
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
例如,汽车制造工厂中,有一个抽象的汽车工厂接口,具体的汽车工厂子类可以根据需求生产不同类型的汽车。 - 抽象工厂模式(Abstract Factory Pattern):
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
比如,家具制造中,有一个抽象家具工厂,可以生产沙发、桌子等多种家具,具体的工厂子类可以生产不同风格的家具组合。 - 单例模式(Singleton Pattern):
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
如操作系统中的任务管理器,在整个系统中只有一个实例,方便对系统任务进行统一管理。 - 建造者模式(Builder Pattern):
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
像组装电脑,有一个电脑建造者,根据不同的配置需求,可以组装出不同性能的电脑。 - 原型模式(Prototype Pattern)
定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
例如:在图形设计软件中,当需要创建多个复杂的图形对象时,可以先创建一个原型图形,然后通过克隆这个原型来快速生成新的图形对象。这样可以避免重复创建复杂对象的过程,提高效率。比如一个具有特定颜色、形状和大小的圆形图形可以作为原型,当需要多个类似的圆形时,直接克隆原型并进行一些微调即可。
二、结构型设计模式
主要用于如何组合已有类和对象获得更大的结构,功能是组合代替、类与类之间的关系。
- 代理模式(Proxy Pattern):
为其他对象提供一种代理以控制对这个对象的访问。
例如网络访问代理,代替用户去访问目标网站,可进行缓存、过滤等操作。 - 装饰器模式(Decorator Pattern):
动态地给一个对象添加一些额外的职责。
就像给咖啡添加糖、牛奶等装饰,在不改变咖啡本身的情况下增加新的功能。 - 适配器模式(Adapter Pattern):
将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
比如手机充电器的转换插头,将不同国家的电源接口转换为手机所需的接口。 - 桥接模式(Bridge Pattern):
将抽象部分与它的实现部分分离,使它们都可以独立地变化。
例如,图形绘制软件中,抽象的图形类和具体的绘制实现分离,可实现不同图形在不同平台上的绘制。 - 外观模式(Facade Pattern)
定义:为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
例如:在一个复杂的智能家居系统中,有各种设备如灯光、窗帘、音响等,每个设备都有自己复杂的控制接口。外观模式可以提供一个统一的智能家居控制界面,用户只需要通过这个简单的界面就可以控制整个智能家居系统,而无需了解每个设备的具体控制细节。这样可以降低系统的复杂性,提高用户使用的便利性。
三、行为型设计模式
描述类和对象之间如何交互以及如何分配职责。功能是关注对象与行为的分离。
- 策略模式(Strategy Pattern):
定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。策略模式让算法的变化独立于使用算法的客户。
如电商平台的促销策略,可以有满减、折扣、赠品等不同策略,根据不同情况进行切换。 - 观察者模式(Observer Pattern):
定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
比如股票交易软件,多个用户(观察者)关注某一只股票(主题),当股票价格变化时,通知所有用户。 - 状态模式(State Pattern):
允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。
比如自动售货机,根据不同的状态(有货、无货、故障等)显示不同的操作界面和行为。 - 中介者模式(Mediator Pattern)
定义:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
例如:在一个在线聊天系统中,多个用户之间的通信可以通过一个中介者(聊天服务器)来管理。用户之间不需要直接相互联系,只需要与服务器进行交互。服务器负责接收用户的消息并转发给相应的用户。这样可以降低用户之间的耦合度,便于系统的维护和扩展。 - 命令模式(Command Pattern)
定义:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
例如:在一个图形编辑软件中,用户的操作可以被封装成命令对象,如绘制直线命令、绘制圆形命令等。这些命令对象可以被存储在历史记录中,以便用户进行撤销和重做操作。同时,命令模式也可以实现对操作的排队执行,提高系统的响应性能。比如用户先绘制了一条直线,然后又绘制了一个圆形,这些操作都可以被封装成命令对象,存储在历史记录中,用户可以随时撤销或重做这些操作。