一句话总结各种设计模式

  1. 单例模式:系统中只实例化一个对象,通过类的getInstance()方法该实例,常用于线程池、连接池、日志对象等等。

  2. 工厂模式:创建与使用分离,把对象实例化的工作交给工厂来作,用户不需要关心对象如何生成的,需要某个对象时,向工厂申请一个即可。

    • 简单工厂:定义一个工厂类,里面有一个createProduct()用于创建对象。实现简单,但是扩展困难,工厂类单一,职责过重。
    • 工厂方法:不再由工厂类创建对象,而是将该任务转嫁给工厂类的各个子类来完成,由子类来决定该实例化哪一个类。
    • 抽象工厂:将多个抽象工厂方法封装到一起,用于生产一系列相关对象(核心功能),这些对象组合在一起是一个更大的产品。比如讲生产CPU的工厂方法和生产内存的工厂方法封装到一起,组成生产电脑的工厂。
  3. 桥接模式:简单来说就是用组合代替继承,避免直接继承带来的子类爆炸。比如图形类,可以按照形状分,也可以按照颜色分,如果用继承方式,m 种形状和 n 种颜色的图形就有 m×n 种,不但对应的子类很多,而且扩展困难。

  4. 适配器模式:系统中某个功能由A接口实现,客户需要用B接口来调用该功能,我们就可以新建一个实现了B接口的适配器类,然后通过组合方式,在适配器类中调用A接口实现的功能。

  5. 外观模式:核心目的在于简化接口,把若干个子系统封装到一起,定义一个更高层的接口,用户不需要关心各个子系统是如何实现的,只需要和高层接口打交道即可。缺点是,增加或删除子系统时需要修改外观类,违背开闭原则。

  6. 装饰器模式:不改变对象的情况下,动态添加功能。抽象装饰器类和具体对象类,实现相同的接口,以组合的方式给对象动态添加功能。

  7. 享元模式:“享元”即共享元素,通过复用一些共享对象,避免创建大量重复对象,减小内存开销。比如围棋中,棋子可以作为抽象享元元素(包含落子方法),黑棋和白棋就是具体享元元素(实现具体享元方法),棋子工厂(创建黑子和白子,存储到一个容器中,并提供获取棋子的方法),非享元元素就是落子的位置,以参数形式传递给享元元素的落子方法。

  8. 策略模式:系统中某种功能可能有多种实现方案(比如排序方案、折扣方案等),策略模式可以帮助我们在不改变代码的情况下,动态选择具体实现方式。具体实现上,就是把所有策略封装起来,实现一个共同接口,在客户代码中实际用抽象接口,而不是具体策略类。

  9. 观察者模式:一种订阅发布模式,对于目标类,当其发生某种事件时,需要通知所有订阅者。在具体实现上,目标类可能用一个列表存储所有订阅者,当事件发生时,通知订阅者。JDK中提供了Observable接口,不过JDK9中已经被弃用,提供了功能更强大的Flow相关类。

  10. 命令模式:把命令封装成对象,我的理解就是把一段实现某种特定功能的代码封装起来,达到快速替换命令的效果,同时解耦客户和命令的具体实现。客户只需要关心执行这个命令,能达到某种效果就行,不需要关心命令的具体实现方式。

  11. 模板方法模式:定义算法骨架,其中某些步骤可能在顶层接口中实现了,但是某些步骤只给出定义,具体实现交给子类来完成。相当于创建了一个模板,子类以这个模板为基础,添砖加瓦,实现更加丰富的功能。在Spring的IOC充分使用了该模式。

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2021-2022 Yin Peng
  • 引擎: Hexo   |  主题:修改自 Ayer
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信