首页 > 代码库 > 设计模式综述
设计模式综述
设计模式的定义是:所谓设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,使用设计模式是为了可重用代码、让代码更容易地被他人理解、保证代码的可靠性。 设计模式根据其目的来分类的,可分为创建型、结构型、行为型模式。根据课本P53分类表重新绘制如下:
范围/目的 | 创建型模式 | 结构型模式 | 行为型模式 |
类模型 | 工厂方法模式 | 适配器模式 |
解释器模式 模板方法模式 |
对象模式 |
抽象工厂模式 建造者模式 原型模式 单例模式 |
适配器模式 桥接模式 组合模式 装饰模式 外观模式 享元模式 代理模式 |
职责链模式 命令模式 迭代器模式 中介者模式 备忘录模式 观察者模式 状态模式 策略模式 访问者模式 |
(一)创建型模式
创建型模式关注对象的创建过程,将对象的创建和对象的使用分离,在使用对象时无须知道对象的创建细节。创建型模式包括简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式、单例模式。
简单工厂模式:根据传入的参数即可返回所需的对象,而不需知道具体类的类名。根据提供给他的数据,返回几个可能类中的一个类的实例。通常它返回的类都有一个公共的父类和公共的方法。(但它不属于GoF设计模式)。
工厂方法模式:定义一个用于创建对象的接口,让子类决定将哪一个类实现实例化。工厂方法模式使一个类的实例化延迟到其子类。将某一类对象的创建过程封装在单独的类中,通过引入抽象层的方式来使得对象的创建和使用更加灵活。
抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。在一个类中可以创建多个不同类型的对象,这些对象所对应的类型都源于抽象层,使得系统具有极佳的扩展性和灵活性。
建造者模式:将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示。一步一步构造一个由多个部分组成的复杂对象。
原型模式:用原型实例指定创建对象的种类,并且通过复制这个原型来创建新的对象。通过复制已有对象创建出相似的其他对象。
单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。控制系统中所创建的对象实例的个数。
简单工厂模式不是23种模式之一。当我们的程序在实例化对象时,如果输入条件不一样,产生的对象也不一样,那么我们可以考虑使用简单工厂对不同的实例进行统一封装。需要什么,只需要传入一个正确的参数,就可以获取所需要的对象,不关心创建细节。由于简单工厂模式只提供了一个工厂类,当有新产品加入到系统中时,必须修改工厂类,加入必要的处理逻辑,违背了“开闭原则”,因此出现工厂方法模式,它的核心是一个抽象工厂类,对于某种类型的对象来说,会有一个特定的对象工厂指向它,这样当我们需要添加一种新类型的产品时,只需要添加两个类,一个是具体产品类,一个是新产品的工厂类,这样更加灵活。由于一个工厂有时候需要的不是一个单一的对象产品,而是多个产品等级结构,就引入了抽象工厂模式。抽象工厂模式是所有形式的工厂模式中最为抽象和最具一般性的一种形态,增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”。
对于一些复杂对象来说,它可以分成多个不同的部分,在实例化时,不同部分之间实例化的顺序是一定的,这时我们就可以使用建造者模式了,比如一份套餐需要一步步的装配完成。主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。
在程序运行过程中,当需要有新的实例对象时,有时并不希望是重新创建一个对象,而是希望新的实例的状态和某个已存在的实例保持一致,此时需要原型模式,一些软件的复制粘贴操作就是原型模式的应用。
单例模式是最简单的设计模式,一个类只有一个实例,必须自行创建这个实例,鼻祖自行向整个系统提供实例,身份证号码具有唯一性,这就是单例模式的一个场景。
(二)结构型模式
结构型模式用来处理类或者对象的组合,将类和对象结合在一起实现指数化效应来形成更大的结构。在结构型模式中分为类结构和对象结构,前者关注类的组合,重心在继承与实现关系,后者关心类和对象的组合,在一个类汇总定义另一个类的实例对象,再通过这个对象调用方法。
适配器模式:将一个类的接口转换成用户希望的另一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。使原本不兼容的事物能够协同工作,而无需修改现有事物的内部结构。
桥接模式:将抽象部分与实现部分分离,使他们都可以独立地变化。当事物存在两个独立变化的维度时,将两个变化因素抽取出来形成高层次的关系关联,使原本复杂的类继承结构变成相对简单,极大减少系统中类的个数。
组合模式:将对象组合成树形结构表示“部分-整体”的层次结构。它使得客户对单个对象和复合对象的使用具有一致性。通过面向对象技术来实现对系统中存在的容器对象和叶子对象进行统一的操作,且客户端无需知道操作对象是容器还是其成员。
装饰模式:动态地给一个对象添加一些额外的职责,就扩展功能而言,它比生成子类方式更为灵活。不使用继承而通过关联关系来调用现有类中的方法,达到复用的目的,并使得对象的行为可以灵活变化。
外观模式:为子系统中的一组接口提供一个一致的界面,定义一个高层接口,这个接口使得这一子系统更加容易使用。为复杂的子系统提供一个统一的入口,简化客户端对多个子系统的访问。
享元模式:运用共享技术有效地支持大量细粒度的对象。通过共享技术实现对象的重用,大量节约系统的内存,该模式关心系统的性能与资源利用情况。
代理模式:为其他对象提供一个代理以控制这个对象的访问。当不能直接访问一个对象时,通过一个代理对象间接访问它。
软件系统中,也有代理,给某一个对象提供一个代理,并由代理对象控制对原对象的引用,这就是代理模式,代理模式协调调用者和被调用者,在一定程度上降低了系统的耦合度。
设计模式综述