如何清晰地去了解常用的设计模式

studygithub5208868 studygithub5208868     2022-12-13     783

关键词:

一、单例模式

单例模式(Singleton Pattern)

是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

注意:

1、单例类只能有一个实例。

2、单例类必须自己创建自己的唯一实例。

3、单例类必须给所有其他对象提供这一实例。

意图:

主要解决: 一个全局使用的类频繁地创建与销毁。

何时使用: 当您想控制实例数目,节省系统资源的时候。

如何解决: 判断系统是否已经有这个单例,如果有则返回,如果没有则创建。

关键代码: 构造函数是私有的。

优点:

1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。

2、避免对资源的多重占用(比如写文件操作)。

缺点: 

没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。

 

使用场景:

1、要求生产唯一序列号。

2、WEB 中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。

3、创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等。

注意事项:

getInstance() 方法中需要使用同步锁 synchronized (Singleton.class) 防止多线程同时进入造成 instance 被多次实例化。

 

二、工厂模式

工厂模式(Factory Pattern)最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

意图: 定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。

主要解决: 主要解决接口选择的问题。

何时使用: 我们明确地计划不同条件下创建不同实例时。

如何解决: 让其子类实现工厂接口,返回的也是一个抽象的产品。

关键代码: 创建过程在其子类执行。

 

应用实例:

1、您需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现。

2、Hibernate 换数据库只需换方言和驱动就可以。

优点:

1、一个调用者想创建一个对象,只要知道其名称就可以了。

2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。

3、屏蔽产品的具体实现,调用者只关心产品的接口。

 

缺点:

 每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。

 

使用场景:

1、日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。

2、数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。

3、设计一个连接服务器的框架,需要三个协议,"POP3"、"IMAP"、"HTTP",可以把这三个作为产品类,共同实现一个接口。

 

注意事项:

 作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。

 

三、适配器模式

适配器模式(Adapter Pattern)

是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。
这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡

意图: 将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

主要解决: 主要解决在软件系统中,常常要将一些 "现存的对象" 放到新的环境中,而新环境要求的接口是现对象不能满足的。

何时使用:

1、系统需要使用现有的类,而此类的接口不符合系统的需要。

2、想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作,这些源类不一定有一致的接口。

3、通过接口转换,将一个类插入另一个类系中。(比如老虎和飞禽,现在多了一个飞虎,在不增加实体的需求下,增加一个适配器,在里面包容一个虎对象,实现飞的接口。)

如何解决: 继承或依赖(推荐)。

关键代码: 适配器继承或依赖已有的对象,实现想要的目标接口。

应用实例:

1、美国电器 110V,中国 220V,就要有一个适配器将 110V 转化为 220V。

2、JAVA JDK 1.1 提供了 Enumeration 接口,而在 1.2 中提供了 Iterator 接口,想要使用 1.2 的 JDK,则要将以前系统的 Enumeration 接口转化为 Iterator 接口,这时就需要适配器模式。

3、在 LINUX 上运行 WINDOWS 程序。 4. JAVA 中的 jdbc。

 

优点:

1、可以让任何两个没有关联的类一起运行。

2、提高了类的复用。

3、增加了类的透明度。

4、灵活性好。

 

缺点:

1、过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。

2、由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。

 

使用场景: 

有动机地修改一个正常运行的系统的接口,这时应该考虑使用适配器模式。

 

注意事项: 

适配器不是在详细设计时添加的,而是解决正在服役的项目的问题。

分析当下最流行的思维框架,思维模型。

...以认知科学为基础的思维系统,它能够帮助人们更加清晰地去理解与思考日常生活中的事物。它可以帮助人们更好地解决问题,更好地分析和理解大量信息,并且更好地应用他们的学习知识。思维框架包括思维过程&#x... 查看详情

linux下vim各模式的操作你了解吗

...nux少不了和vim打交道,今天我们就来了解一下什么是vim,如何高效使用vim以及如何配置vim。vi和vim都是linux下多模式的编辑器,两者关系类似于c/c++的关系,vim是vi的升级版,不仅兼容vi的所有指令,还增加了一些新的特性,比如... 查看详情

测试用例的设计步骤

测试用例的设计步骤作为测试新人,如何实现测试用例的设计一直是我的一个疑惑,在工作中写过几个项目的测试用例,尝试总结一个测试用例的设计步骤。前提:编写测试用例之前我们需要对项目的需求有清晰的了解,对要测... 查看详情

ui设计常用字体有哪

...体排版技巧有哪些的目的是帮助设计人员和开发人员了解如何使用字体,以创建出色的界面。  一、版式,品牌和用户  查看详情

设计为服务的最佳实践(转)

...模的互联网行业,例如社交,电商,物流,金融等领域,如何使用微服务构建互联网应用以满足用户需求。要了解微服务是什么,你必须了解如何将单体应用程序,拆解为独立打包和部署的微型应用程序。本文章将帮助你清晰化... 查看详情

网络诊断常用配置命令

...  诊断命令都是DOS命令的一类,学习过程中不需要过多地去了解其详细的诊断原理,只需要了解在何种情况下,使用何种命令即可;此外对Ping命令应该重点掌握。虽然是DOS命令,但在Windows操作系统下,仍可以通过在“开始/... 查看详情

架构_10个常用的软件架构模式(代码片段)

...下常见问题的通用且可重用的解决方案。架构模式与软件设计模式很相似,但架构模式的层次更高,且外延更大。这篇文章将简述常见的10种架构模式的概念、用法 查看详情

设计篇35#如何让可视化设计更加清晰?(代码片段)

说明【跟月影学可视化】学习笔记。分清信息主次,建立视觉层次用醒目的颜色突出显示数据,把被淡化的其他视觉元素当作背景。比如:平均温度与露点的散点例子<!DOCTYPEhtml><htmllang="en"><head>&... 查看详情

设计篇35#如何让可视化设计更加清晰?(代码片段)

说明【跟月影学可视化】学习笔记。分清信息主次,建立视觉层次用醒目的颜色突出显示数据,把被淡化的其他视觉元素当作背景。比如:平均温度与露点的散点例子<!DOCTYPEhtml><htmllang="en"><head>&... 查看详情

如何清晰理解布斯算法boothalgorithm的原理

参考技术A你用的什么综合器?FPGA还是DC?综合工具优化的当然会比你设计的要好,这是毋庸置疑的兄弟。是否冗余你可以按照最原始的方法(移位加)设计一个乘法器,对比综合结果。 查看详情

如何有效地去交错位(逆莫顿)

】如何有效地去交错位(逆莫顿)【英文标题】:Howtoefficientlyde-interleavebits(inverseMorton)【发布时间】:2011-06-2200:14:09【问题描述】:这个问题:Howtode-interleavebits(UnMortonizing?)有一个很好的答案来提取莫顿数的两半之一(只是奇数... 查看详情

组件库实战|教你如何设计web世界中的表单验证(代码片段)

教你如何设计Web世界中的表单验证💬序言🗯️一、验证输入框ValidateInput1.设计稿抢先知2.简单的实现3.抽象验证规则4.v-model5.使用$attrs支持默认属性💭二、验证表单ValidateForm1.组件需求分析2.使用插槽slot3.父子组件通... 查看详情

隐藏的引导模式有多清晰

...trapmodalonhide【发布时间】:2015-09-1010:37:33【问题描述】:如何在关闭/隐藏/关闭时清除引导模式?我有以下模态定义:<buttontype="button"class="btnbtn-primary"data-toggle="modal"data-target="#myModal">AddNewComment</butto 查看详情

常用开源框架中设计模式使用分析(代码片段)

一、前言说起来设计模式,大家应该都耳熟能详,设计模式代表了软件设计的最佳实践,是经过不断总结提炼出来的代码设计经验的分类总结,这些模式或者可以简化代码,或者可以是代码逻辑开起来清晰,或者对功能扩展很方... 查看详情

清晰全屏模式

...式。清晰度带有某些尺寸,但不是全屏尺寸。有人知道我如何制作清晰模式全屏吗?【问题讨论】:“全屏”100%宽度和高度是什么意思?什么情况下需要?【参考方案1】:Clarity模式旨在提醒用户、确认对话框和面向任务的工 查看详情

如何高效地去调试ugui的源码

...ds/?tab=tags  注意与自己使用的Unity的版本对应起来2、如何将自己对UGUI源码的修改,使用到项目中?  假如修改了Button.cs的源码,在按钮被按下的时候打印一个日志,如图:    重新生成一下解决方案,将 Outpu 查看详情

常用设计模式:装饰者模式

  今天看了一篇很棒的介绍装饰者模式的文章,于是就按照以往的惯例,学习了之后手动的码了这么一篇随记记录自己的体会,并且参考原文的例子,自己手动的实现了一遍整个demo,原文地址为:http://blog.csdn.net/zhaoyanjun6/artic... 查看详情

以小见大:如何设计注册登录页?

一个合格的注册登录页面,应该是具有清晰的操作流程。朋友说某个APP不错,下载后正准备好好体验一番,却被糟糕的注册登录页面弄的精疲力竭,无奈最终只能放弃。注册登录流程能让用户扭头就走,也能让产品获得新用户的... 查看详情