设计模式

  • 简单工厂
    优点:只需要传需要的参数,不需要知道具体的创建过程,就能获取到需要的类。
    缺点:职责相对过重,增加新的产品时需要修改工厂类的判断逻辑,违背开闭原则。不易于扩展过于复杂的产品结构。
    工厂方法模式:方法的工厂,抽象工厂模式:复杂的工厂模式

  • 单例模式
    定义:指确保一个类在任何情况下都绝对只有一个实例,并提供一个全局访问点。属于创建型模式
    优点:省内存
    缺点:没有接口,扩展困难

  • 原型模式
    定义:原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。调用者不需要知道任何创建细节,不调用构造函数。属于创建型模式
    优点:java自带浅克隆性能优良,深克隆简化操作
    缺点:必须配备克隆方法,违反了开闭原则

  • 建造者模式
    定义:把一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示。属于创建型模式
    优点:封装性好,创建和使用分离。扩张性好
    缺点:产生多余的Builder对象。产品内部发生变法,建造者都要修改,成本较大。

  • 代理模式
    定义:为其他对象提供代理,以控制对这个对象的访问。属于结构型设计模式。
    优点:一定程度上降低了系统的耦合程度,易于扩展。可以起到保护对象的作用。增强目标对象的职责。
    缺点:造成系统中类的数目增加。增加了一个代理对象,请求处理变慢,增加了系统的复杂度。

  • 门面模式
    定义:又叫外观模式,提供了一个统一的接口,用来访问子系统中的一群接口。属于结构型模式。
    优点:简化了调用过程,无需深入了解子系统,以防给子系统带来风险。减少系统依赖、松散耦合。更好的划分访问层次,提高了安全性。
    缺点:当增加子系统和扩张子系统行为时,可能容易带来未知风险。不符合开闭原则。某些情况下可能违背单一职责原则。

  • 装饰器模式
    定义:也叫包装模式,是指在不改变原有对象的基础上,将功能附加到对象上,提供了比继承更有弹性的替代方案。属于结构型模式。
    优点:是继承的有力补充,比继承灵活。装饰器完全遵守开闭原则。
    缺点:会出现更多的类,增加程序的复杂性。

  • 享元模式
    定义:又称为轻量级模式,是对象池的一种实现。类似线程池,线程池可以避免不停的创建和销毁多个对象,消耗性能,提供了减少对象数量从而改善应用所需的对象结构的方式。属于结构型模式。
    优点:减少对象的创建,降低内存中对象的数量,降低系统的内存,提高效率。减少内存之外的其他资源的占用。
    缺点:关注内外部状态,关注线程安全问题。使系统的逻辑复杂化

  • 组合模式
    定义:也称整体部分模式,通过单个对象(叶子节点)和组合对象(树枝节点)用相同的接口进行表示。属于结构型模式。
    优点:清楚的定义分层次的复杂对象,表示对象的全部或部分层次。让使用者忽略了层次的差异,方便对整个层次结构进行控制。简化客户端代码。符合开闭原则。
    缺点:限制类型时会比较复杂。使设计模式变得更加抽象。

  • 适配器模式
    定义:又叫变压器模式,他的功能是将一个类的接口变成客服端所期望的另一种接口,从而使原本因接口不匹配而导致无法一起工作的两个类能够一起工作。属于结构型设计模式。
    优点:提高类的透明性和复用。目标类和适配器类解耦,提高程序的扩展性。符合开闭原则。
    缺点:需要考虑全面,增加系统的复杂性。增加代码的可读性,增加代码的阅读难度。

  • 桥接模式
    定义:是将抽象部分和他的具体实现部分分离,使他们可以独立地变化。属于结构型模式。
    优点:分离抽象部分及具体实现部分。提高了系统的扩展性。符合开闭原则。符合合成复用原则。
    缺点:增加了系统的理解与设计难度。需要正确地识别系统中两个独立的维度。

  • 委派模式
    定义: 负责任务的调度和任务分配,将任务的分配和执行分离开来。可以看做是一种特殊情况下的静态代理的全权代理。属于行为型模式。
    优点:能够细化大型的任务,能够加快任务的执行效率。
    缺点:需要根据任务的复杂程度进行不同的变化,在任务比较复杂的情况下可能需要进行多重委派,容易造成紊乱。

  • 模板方法模式
    定义:定义一个算法的骨架,并允许之类为其中的一个后者多个步骤提供实现。属于行为性设计模式。
    优点:提高代码的复用性。提高代码的扩展性。符合开闭原则。
    缺点:类数目的增加,每一个抽象类都需要一个子类来实现,导致类的个数增加,同时增加了系统实现的复杂度。父类添加新的抽象方法,所有子类都要改一遍,继承关系自身缺点。

  • 策略模式
    定义:将定义的算法家族、分别封装起来,让他们之间可以互相替换,从而让算法的变化不会影响到使用算法的用户。属于行为型模式。
    优点:符合开闭原则。避免使用多重条件转移语句。可以提高算法的保密性和安全性。
    缺点:使用非常多策略类,增加维护难度。客户端必须知道所有的策略,并且自行决定使用哪一个策略类。

  • 责任链模式
    定义:将链中每一个节点看作是一个对象,每个处理的请求均不同,且内部自动维护一个下一节点对象。当一个请求从链式的首段发出时,会沿着链的路径依次传递给每一个节点对象,直至有对象处理这个请求为止。属于行为型模式。
    优点:将请求与处理解耦。链路结构灵活,可以通过改变链路结构动态的新增或删减责任。易于扩展新的请求处理类,符合开闭原则。
    缺点:责任链太长或者处理时间过长,会影响整体性能。如果节点对象存在循环引用时,会造成死循环,导致系统崩溃。

  • 迭代器模式
    定义:又称游标模式,它提供一种顺序访问集合/容器对象元素的方法,而又无须暴露集合内部表示。属于行为型模式。
    优点:多态迭代。简化集合对象接口。元素迭代功能多样化。解耦迭代和集合。
    缺点:对于比较简单的遍历,使用迭代器方式遍历较为繁琐。

  • 命令模式
    定义:指对命令的封装,每一个命令都是一个操作,请求的一方发出请求要求执行一个操作,接收的一方收到请求,并执行操作。属于行为型模式。
    优点:通过引入中间件,解耦了命令请求与实现。扩展性良好,可以很容易地增加新命令。
    缺点:具体命令类可能过多。增加了程序的复杂度,理解更加困难。

  • 备忘录模式
    定义:又称为快照模式或者令牌模式,是指在不破坏封装的前提下,捕获一个对象的内部状态,并在对象之外保存这个状态。属于行为型模式。
    优点:简化发起人实体类职责,隔离状态存储与获取,实现了信息的封装,客户端无须关心状态的保存细节。提供回滚功能。
    缺点:消耗资源保存的状态过多时,每一次保存都需要很多内存。

  • 状态模式
    定义:又称为状态机模式。是指允许对象在内部状态发生改变时改变他的行为,对象看起来好像修改了他的类。属于行为模式。
    优点:是代码更加简洁,提高系统可维护性。使状态切换显示化。状态职责明确且具有扩展性。
    缺点:会造成类太多。使用不当将导致程序结构和代码的混乱。

  • 中介模式
    定义:用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使其耦合松散,而且可以独立地改变他们之间的交互。属于行为型模式。
    优点:减少类间依赖,将多对多依赖转化成了一对多,降低了类间耦合。类间各司其职,符合迪米特法则。
    缺点:将多个对象直接的相互依赖变成了中介者和多个同事类的依赖关系。当同事类越多时,中介者就会越臃肿,变得复杂且难以维护。

  • 解释器模式
    定义:解释器模式给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。属于行为型模式。
    优点:扩展性强。增加了新的解释表达式的方式。易于实现文法。
    缺点:语法规则较复杂时,会引起类膨胀。执行效率比较低。

  • 观察者模式
    定义:又叫发布-订阅模式。定义一种一对多的依赖关系,一个主体对象可被多个观察者对象同时监听,使得每当主题对象状态变化时,所有依赖于他的对象都会得到通知并被自动更新。属于行为型模式。
    优点:观察者和被观察者是松耦合的,符合依赖倒置原则。分离了表示层和数据逻辑层,并且建立了一套触发机制,使得数据的变化可以响应到多个表示层上。
    缺点:如果观察者数量过多,则事件通知会耗时较长。如果观察者和被观察者之间存在循环依赖,则可能造成两者之间的循环调用,导致系统崩溃。

  • 访问者模式
    定义:是一种将数据结构与数据操作分离的设计模式。属于行为型模式。
    优点:解耦了数据结构与数据操作。扩展性好。符合单一职责原则。
    缺点:无法增加元素类型,违背了开闭原则。具体元素变更困难。违背依赖倒置原则。

posted @ 2020-12-29 20:47  南笙ll  阅读(107)  评论(0)    收藏  举报