当前位置: 首页 > news >正文

你知道那些常用的设计模式?

1. 单例模式:单例模式保证系统内存中该类只有一个对象。

优势:可以防止频繁的创建和销毁对象造成的资源浪费,以此来提高系统性能。

实现方式:懒汉模式创建和饿汉模式创建。

应用场景:我们JDK中,java.lang.Runtime就是百科全书的单例模式(饿汉式),spring里面就是用了单例模式

2.工厂模式:将实例化对象的代码提取出来,放到一个类里面统一管理,由子类决定是否实例化。

link

优势:工厂方法模式具有很好的封装性。客户端不需要知道创建对象的过程,只需要知道要创建的是哪个具体的产品即可。

实现方式:简单工厂模式,工厂方法模式,抽象工厂模式。

简单工厂模式:将被使用方的创建过程封装到一个类中,这样就在使用方和被使用方之间做了一个缓冲,也就是使用方和被使用方做了一个解耦,提高了软件的可扩展性和可维护性和可复用性.

工厂方法模式:将简单工厂的创建对象的方法写成一个抽象方法,也就是在工厂类或者接口中不知道如何创建该对象,创建具体对象交给工厂类的子类或者实现类去做.

抽象工厂模式:抽象工厂模式为创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们的具体类。抽象工厂模式是工厂方法模式的升级版本,在有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。,抽象工厂方法不再是单独的接口,而是生产一类产品的接口,可以生产多个相关联产品。

抽象工厂模式和工厂方法模式的区别:

如果产品单一,适合使用工厂模式。但是如果有多个业务品种、业务分类时,需要使用抽象工厂模式。也就是说,工厂模式针对的是一个产品等级结构 ,抽象工厂模式针对的是面向多个产品等级结构的。

3. 代理模式:将原类进行封装,客户端不能直接找到原类,必须通过代理角色。即代理是原类的一个替身,客户端要找原类,必须找代理才可以搞定。明星和经纪人的关系就是一种代理模式。

优势:为一个对象提供一个替身,以控制对这个对象的访问.即通过代理对象访问目标对象.这样做的好处 是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.

实现方式:静态代理和动态代理。

应用场景:动态代理在实现阶段不用关心代理谁,而在运行阶段才指定代理哪一个对象。相对来说,自己写代理类的方式就是静态代理。

4. 装饰器模式

优势:动态的将新功能附加到对象上.在对象功能扩展方面,它比继承更有弹性,装饰者模式也体现了 开闭原则(ocp)

实现方式:静态代理和动态代理。

应用场景:String 常量池,数据库连接池

5. 享元模式:系统中有大量对象,这些对象消耗大量内存,并且对象的状态大部分可以外部化时,我们就可以考虑选用享元模式。在享元模式这样理解,“享”就表示共享,“元”表示对象

优势:享元模式大大减少了对象的创建,降低了程序内存的占用,提高效率。

实现方式:静态代理和动态代理。

应用场景:String 常量池,数据库连接池

6. 模板模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一 个算法的结构,就可以重定义该算法的某些特定步骤。

优势:实现了最大化代码复用。

实现方式:它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行.

应用场景:当要完成在某个过程,该过程要执行一系列步骤 ,这一系列的步骤基本相同,但其 个别步骤在实现时 可能不同,通常考虑用模板方法模式来处理

7. 策略模式:定义算法族(策略组),分别封装起来,让他们之间可以互相替换,此模式 让算法的变化独立于使用算法的客户

优势:体现了“对修改关闭,对扩展开放”原则,客户端增加行为不用修改原有代码,只要添加一种策略(或者行为) 即可,避免了使用多重转移语句

实现方式:策略模式将算法封装在独立的 Strategy 类中使得你可以独立于其 Context 改 变它,使它易于切换,易于理解,易于扩展

应用场景: JDK的数组的比较器就使用了策略模式

8. 原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型,创建新的对象

优势:允许一个对象再创建另外一个可定制的对象,无需知道如何创建的细节

实现方式:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它 们自己来实施创建,即 对象.clone()

应用场景:Spring 中原型 bean 的创建,就是原型模式的应用

相关文章:

  • 百度地图2.0瓦片地址获取(窗口内瓦片)
  • 设计模式的六大原则?
  • 小知识点
  • 如何做“足够好”的软件
  • 如何理解设计模式的六大原则?
  • 设计模式的分类
  • 盲并遗忘着-利用应用交付透析大型网站日志
  • 请手写一下单例模式?
  • ArrayList
  • python 遗传算法精简版
  • B-树和B+树区别
  • 红黑树
  • 负载均衡之基于L3/4负载
  • 跳表
  • 关于CookieUtile的相关代码
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • (三)从jvm层面了解线程的启动和停止
  • 2017-09-12 前端日报
  • Android框架之Volley
  • ES6--对象的扩展
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • JavaScript类型识别
  • Java基本数据类型之Number
  • Octave 入门
  • Python十分钟制作属于你自己的个性logo
  • Redash本地开发环境搭建
  • swift基础之_对象 实例方法 对象方法。
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • 订阅Forge Viewer所有的事件
  • 七牛云假注销小指南
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 如何学习JavaEE,项目又该如何做?
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 物联网链路协议
  • 再谈express与koa的对比
  • 说说我为什么看好Spring Cloud Alibaba
  • ​flutter 代码混淆
  • #{}和${}的区别是什么 -- java面试
  • #大学#套接字
  • #前后端分离# 头条发布系统
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (二)c52学习之旅-简单了解单片机
  • (排序详解之 堆排序)
  • (原)Matlab的svmtrain和svmclassify
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • (转)Linux下编译安装log4cxx
  • (转)Mysql的优化设置
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • .bat批处理(一):@echo off
  • .naturalWidth 和naturalHeight属性,
  • .net Application的目录