GOF设计模式

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

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

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

设计模式的使用:
    首先,设计模式有其应用的场合,不相宜的场合乱用设计模式有害无益;其次,设计模式主要解决对象之间相互通信、 相互依赖的结构关系。
    在描述一个设计模式时,至少需要包含四个方面:模式名称(Pattern name)、问题(Problem)、解决方案(Solution)、效果(Consequence)。

设计模式要有自己的名称。

设计模式的目的就是解决问题。

设计模式要有解决问题的方法描述。

设计模式有其更具体的效果描述

创造型模式:  

(1) Factory Method 模式(工场方法模式)。 Factory Method 模式提供了一种延迟创建类的方法,使用
这个方法可以在运行期由子类决定创建哪一个类的实例。

    (2) Abstract Factory 模式(抽象工场模式)。 Abstract Factory 又称为抽象工厂模式,该模式主要为解决
复杂系统中对象创建的问题。


    (3) Builder 模式(建造者模式)。 Builder 模式与 Abstract Factory 模式非常类似,但Builder模式是逐步地构造出一个复杂对象,并在最后返回对象的实例。Builder 模式可以把复杂对象的创建与表示分离,使得同样的创建过程可以创建不同的表示。

    (4) Prototype 模式(原型模式)。 Prototype 模式可以根据原型实例制定创建的对象的种类,并通过深复制这个原型来创建新的对象。 Prototype 模式有着同 Abstract Factory 模式和 Builder模式相同的效果,不过当需要实例化的类是在运行期才被指定的而且要避免创建一个与产品曾是平行的工厂类层次时,可以使用 Prototype 模式。使用 Prototype 模式可以在运行时增加或减少原型,比 Abstract Factory 和 Builder 模式更加灵活。
   (5) Singleton 模式(单例模式)。 Singleton 模式也是一种很有代表性的模式。使用 Singleton 模式可以保证一个类仅有一个实例,从而可以提供一个单一的全局访问点。将在 9.2 中对Singleton 作更详细的介绍。

结构型模式:

(6) Adapter 模式。 Adapter 模式可以解决系统间接口不相容的问题。通过 Adapter 可以把类的接口转化为客户程序所希望的接口,从而提高复用性。
(7) Bridge 模式。 Bridge 模式把类的抽象部分同实现部分相分离,这样类的抽象和实现都可以独立地变化。
(8) Composite 模式。 Composite 模式提供了一种以树形结构组合对象的方法,使用Composite 可以使单个对象和组合后的对象具有一致性以提高软件的复用性。
(9) Decorator 模式。 Decorator 模式可以动态地为对象的某一个方法增加更多的功能。在很多时候,使用 Decorator 模式可以不必继承出新的子类从而维护简洁的类继承结构。在 9.2 节中将对 Decorator 模式作更详细的介绍。
(10) Facade 模式。 Facade 模式为一组类提供了一致的访问接口。使用 Facade 可以封装内部具有不同接口的类,使其对外提供统一的访问方式。 Facade 模式在 J2EE 系统开发中发展为 Session Facade 模式。
(11) Flyweight 模式。 Flyweight 模式可以共享大量的细粒度对象,从而节省创建对象所需要分配的空间,不过在时间上的开销会变大。
(12) Proxy 模式。顾名思义, Proxy 模式为对象提供了一种访问代理,通过对象 Proxy可以控制客户程序的访问。例如:访问权限的控制、访问地址的控制、访问方式的控制等,甚至可以通过 Proxy 将开销较大的访问化整为零,提高访问效率。

行为模式:

(13) Interpreter 模式。定义了一个解释器,来解释遵循给定语言和文法的句子。
(14)Template Method 模式。定义一个操作的模板,其中的一些步骤会在子类中实现,以适应不同的情况。
(15) Chain of Responsibility 模式。 Chain of Responsibility 模式把可以响应请求的对象组织成一条链,并在这条对象链上传递请求,从而保证多个对象都有机会处理请求而且可以避免请求方和相应方的耦合。
(16) Command 模式。将请求封装为对象,从而增强请求的能力,如参数化、排队、记录日志等。
(17) Iterator 模式。 Iterator 模式提供了顺序访问一个对象集合中的各元素的方法,使用 Iterator 可以避免暴露集合中对象的耦合关系。
(18) Mediator 模式。 Mediator 模式可以减少系统中对象间的耦合性。 Mediator 模式使用中介对象封装其他的对象,从而使这些被封装的对象间的关系就成了松散耦合。

(19) Memento 模式。 Memento 模式提供了一种捕获对象状态的方法,且不会破坏对象的封装。并且可以在对象外部保存对象的状态,并在需要的时候恢复对象状态。
(20) Observer 模式。 Observer 模式提供了将对象的状态广播到一组观察者的方式,从而可以让每个观察者随时可以得到对象更新的通知。
(21) State 模式。 State 模式允许一个对象在其内部状态改变的时候改变它的行为。
(22) Strategy 模式。使用 Strategy 模式可以让对象中算法的变化独立于客户。
(23) Visitor 模式。表示对某对象结构中各元素的操作,使用 Visitor 模式可以在不改变各元素类的前提下定义作用于这些元素的新操作。

### GoF设计模式的概念 GoF(Gang of Four,四人组)设计模式是由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位作者在其经典著作《Design Patterns: Elements of Reusable Object-Oriented Software》中提出的。这些模式被划分为三类:创建型模式、结构型模式以及行为型模式[^2]。 #### 创建型模式 创建型模式关注的是对象的创建过程,提供了灵活的方式来实例化对象而不是直接通过new操作符来完成。常见的创建型模式有: - **工厂方法模式**:定义了一个用于创建对象的接口,但是由子类决定要实例化的类是哪一个。 - **抽象工厂模式**:提供了一种方式来集中管理一系列相关或者依赖的对象。 - **单例模式**:确保某一个类只有一个实例,并且自行实例化并向整个系统提供这个实例。 - **建造者模式**:将复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。 - **原型模式**:利用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。 #### 结构型模式 结构型模式主要处理类或对象的组合问题,描述如何将多个类或对象组装成更大的结构并简化它们之间的关系。典型的结构型模式包括: - **适配器模式**:允许不兼容的接口能够一起工作。 - **装饰器模式**:动态地给对象添加额外的责任而无需修改其结构[^3]。 - **代理模式**:为其他对象提供一种代理以控制对该对象的访问。 - **外观模式**:为一组复杂的子系统提供一个统一的高层接口,从而使其更易于使用。 - **桥接模式**:将抽象部分与其实现部分分离开来,使两者都可以独立变化。 - **组合模式**:允许客户以一致的方式对待单独的对象和对象集合。 - **享元模式**:通过共享尽可能多的数据来支持大量细粒度的对象。 #### 行为型模式 行为型模式专注于对象间的行为和职责分配,涉及算法和对象间的通信。以下是几种典型的行为型模式: - **状态模式**:允许对象在内部状态改变时改变它的行为,好像改变了它的类一样[^1]。 - **策略模式**:定义了一系列可互换的算法,并让它们可以在运行时自由切换。 - **观察者模式**:当某个主题的状态发生改变时,所有依赖于它的观察者都会得到通知并自动更新。 - **迭代器模式**:提供一种顺序访问聚合对象中的各个元素的方法,而不暴露该对象的内部表示。 - **责任链模式**:允许多个接收者有机会处理请求,直到有一个接收者真正接受为止。 - **命令模式**:将请求封装成对象,从而使你可以参数化其它对象并对请求排队或记录日志等功能的支持。 - **备忘录模式**:保存一个对象的内部状态,在以后适当的时候恢复它。 - **中介者模式**:用一个中介对象来封装一系列的对象交互。 - **解释器模式**:为简单的语言定义语法表达式的一种解释执行机制。 ### 应用场景分析 每种设计模式都有特定的应用场合,下面列举了一些常见情况下的适用模式: - 当需要延迟对象的实际创建时间到程序运行期间才确定具体的类型时,可以选择使用**工厂方法模式**或**抽象工厂模式**。 - 如果希望在整个应用程序生命周期内只存在唯一的一个全局变量,则应该考虑采用**单例模式**。 - 对象的功能需要逐步增强而又不想改动原有代码的情况下,推荐使用**装饰器模式**。 - 需要在不影响现有客户端的前提下引入新类型的组件时,适合选用**适配器模式**。 - 要求降低系统模块之间耦合程度的同时提高灵活性的话,可以尝试运用**桥接模式**。 - 处理业务逻辑过程中涉及到多种不同条件分支判断语句时,可能需要用到**状态模式**或其他类似的行为型模式。 ```python class SingletonMeta(type): _instances = {} def __call__(cls, *args, **kwargs): if cls not in cls._instances: instance = super().__call__(*args, **kwargs) cls._instances[cls] = instance return cls._instances[cls] class Database(metaclass=SingletonMeta): pass db_instance_1 = Database() db_instance_2 = Database() print(db_instance_1 is db_instance_2) # True ``` 上述Python示例展示了如何实现单例模式,无论调用了多少次`Database()`函数,始终返回同一个数据库连接实例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值