前言:本篇系看完《研磨设计模式》一书的个人理解和总结,可能存在不正确的地方,看时需要持怀疑态度。另外,所有的图都是示意图,示意,示。

适配器模式(Adaptor):

几点解释:

  1. 本质:功能已经实现了,但是接口不匹配,中间加一层适配器类,通过转调的方式,将已有的功能匹配到特定的接口上。
  2. 客户端使用的是 接口A, 功能A,同时已经存在了功能B,只是接口和客户端使用的 A接口不一致。此时,不想客户端改动代码,也不想改动功能B的实现代码,那就需要在中间加一层 适配器类Adaptor,实现接口 A 并持有一个B的实例,Adaptor中的那些方法最终需要转调 B实例的方法,从而 将B接口的功能适配到 A接口上。
  3. 适配适配,其实就是已有的东西不匹配,需要加个中间者来连接两端。这其实在我们的生活中也会经常用到,电脑上各种的转接线,就是现实生活中的硬件适配器。
  4. 有的时候,某些类库可能很早就有了,后来又多了几个类库,几个类库给出了同一类型业务的不同处理,外观差别很大,为了我们可以以一种统一的方式使用这些类库,我们可以定义或者以某个类库的接口为标准,将其他的类库通过适配器的方式适配到同一个接口上,这样统一了几个类库的外观。当然,这种情况很少见,我们的前人在设计的时候很好的遵循了面向接口编程的思想,大多数时候都是先定义好接口,之后大家给出不同的实现。

单例模式(Singleton):

说明: 因为在 JVM中通过 类加载器实例和类实例 来唯一确定一个 实例,即 Java中的单例是  类加载器级别的。

下面按照下列顺序依次给出单例的Java实现:饿汉、懒汉、双重检查锁、私有内部类、枚举

饿汉模式:

public class Singleton {/*** 在 类加载的 init阶段初始化,由JVM来保证只会初始化一次*/private static Singleton singleton = new Singleton();/*** 构造方法私有 无法从外部创建实例*/private Singleton(){}/*** 全局唯一访问点* @return Singleton*/public static Singleton getInstance(){return singleton;}}

分析:在 类被加载时就已经完成了实例的初始化,而不是在 需要时,这点要注意

懒汉模式:

public class Singleton {private static Singleton singleton = null;/*** 构造方法私有 无法从外部创建实例*/private Singleton(){}/*** 全局唯一访问点 内置锁同步,不然多线程下会 重复创建* @return Singleton*/public static synchronized Singleton getInstance(){if (singleton == null){singleton = new Singleton();}return singleton;}}

分析:做到了延迟加载,但是 不管实例有没有被创建,每次都会有加锁和解锁的开销,不合理,性能也不好

双重检查锁(懒汉的优化):

public class Singleton {/*** 声明为 volatile* 不然多线程下,可能会出现线程获取到的实例并未完全初始化*/private static volatile Singleton singleton = null;/*** 构造方法私有 无法从外部创建实例*/private Singleton(){}/*** 全局唯一访问点* @return Singleton*/public static  Singleton getInstance(){if (singleton == null){synchronized (Singleton.class){if (singleton == null){singleton = new Singleton();}}}return singleton;}}

分析:延迟加载,有了实例的情况下不需要再进行 加锁解锁,但是 volatile 的使用还是会有轻微的性能问题,因为每次都会直接操作主内存

私有内部类(比较优雅):

public class Singleton {/*** 构造方法私有*/private Singleton(){}private static class SingletonHolder{private static Singleton singleton = new Singleton();}public static Singleton getInstance(){return SingletonHolder.singleton;}}

分析:即利用了JVM的类初始化同步机制,又可以在 需要使用的时候才初始化,优雅。

枚举(可能是更合适的单例实现方式):

public enum SingletonEnum {/*** 某单例*/SOME_INSTANCE;private Singleton singleton;/*** 此方法由JVM在第一次使用枚举类实例 的时候调用* 可以看成是 private 外部无法调用*/SingletonEnum(){singleton = new Singleton();}public Singleton getInstance(){return this.singleton;}private class Singleton{private Singleton(){}}
}

分析:利用了 Java对枚举的处理,更简单

《研磨设计模式》读书笔记之:适配器模式、单例模式相关推荐

  1. 大话设计模式读书笔记

    主题 概要 设计模式 大话设计模式读书笔记 编辑 时间 新建 20170423 序号 参考资料 1 大话设计模式 重新看了一遍设计模式,除了一些已经特别熟悉的模式,都自己敲了一遍代码,有些豁然开朗的感 ...

  2. JavaScript设计模式读书笔记(一)= 创建型设计模式

    全系列目录 JavaScript设计模式读书笔记(一)=> 创建型设计模式 JavaScript设计模式读书笔记(二)=> 结构型设计模式 JavaScript设计模式读书笔记(三)=&g ...

  3. JavaScript设计模式读书笔记(四)= 技巧型设计模式

    全系列目录 JavaScript设计模式读书笔记(一)=> 创建型设计模式 JavaScript设计模式读书笔记(二)=> 结构型设计模式 JavaScript设计模式读书笔记(三)=&g ...

  4. 设计模式读书笔记-----工厂方法模式

    一.问题 在前一章<设计模式读书笔记-----简单工厂模式>中通过披萨的实例介绍了简单工厂模式.在披萨实例中,如果我想根据地域的不同生产出不同口味的披萨,如纽约口味披萨,芝加哥口味披萨.如 ...

  5. 设计模式---读书笔记

    一.文章来由 按照惯例,来一个来由,这是<设计模式-可复用面向对象软件的基础>的读书笔记,整理给自己看的,整理的内容也会不断更新.大神轻喷~~如果不喜欢请留言说明原因再踩哦,谢谢,我也可以 ...

  6. Head First设计模式读书笔记六 第七章上 适配器模式

    本文示例代码材料源自Head First设计模式 以前整理自己整理的链接: https://blog.csdn.net/u011109881/article/details/58261956 思想 要 ...

  7. 大话设计模式读书笔记之单例模式

    1.定义: 保证一个类只有一个实例,并提供一个访问它的全局的访问点. 通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象.一个最好的办法就是,让类自身负责保存它的唯一实例.这个 ...

  8. 设计模式读书笔记汇总

    文章目录 一:简单工厂模式:代码无错就是优? 二:策略模式:出行(公交,打车...)(android中的动画) 三:装饰模式 ---->>>android源码中:Context和Co ...

  9. 设计模式读书笔记1-概述

    设计模式简介 设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用.设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案.这些解决方案是众多软 ...

  10. Head First设计模式读书笔记六 第七章下 外观模式

    本文示例代码材料源自Head First设计模式 以前整理自己整理的链接: https://blog.csdn.net/u011109881/article/details/59153772 简介 H ...

最新文章

  1. 机器学习特征工程之特征缩放+无量纲化:数据标准化(StandardScaler)
  2. 关于个别网段上网时断时续的问题解决
  3. 低效能人士的七个习惯
  4. 通向架构师的道路(第七天)之漫谈使用ThreadLocal改进你的层次的划分
  5. P1152 欢乐的跳( python3实现)
  6. java 赋值md5_Hook Java API以获得MD5加密前数据
  7. 滴滴为什么接不到长途单?
  8. CentOS7(64)环境使用rpm命令安装gcc
  9. Javascript第六章世上最全常用RegExp正则表达式及表单验证源码第七课
  10. ZendFramework多模块配置
  11. fastjson safemode_Fastjson远程代码执行漏洞安全通告
  12. Excel-财务函数1
  13. 一台电脑群控上百台手机是什么样?
  14. VS201编译jpeg
  15. 苹果手机投屏软件_苹果手机怎样投屏到笔记本?
  16. DEM数据获取、数据镶嵌、掩膜提取
  17. java微信群自动回复_社群运营,你该如何选择一款好用的微信群管理工具?
  18. 超市管理系统设计报告
  19. postgres 通过zhparser实现全文搜索功能
  20. 概率统计及其应用第三章知识总结_数学篇:概率论复习规划

热门文章

  1. c语言程序设计支持win10,win tc 64位下载-wintc C语言编译器64位下载 1.9.1 win10兼容版 - 河东下载站...
  2. 不讲武德,Java分布式面试题集合含答案!
  3. listary——一个强大的windows高效工具
  4. UE4官方文档毛发部分整合笔记
  5. Java后台调用第三方支付接口(易宝支付)
  6. 英语总结系列(九):百忙中依然坚持的九月
  7. mac 安装adb工具
  8. 多媒体计算机教室的使用与管理,多媒体教室计算机管理论文
  9. 2021年游戏项目的十大编程语言:C++、Java、C#均上榜
  10. linux如何清理文件系统,最佳Linux文件系统清理工具