2019独角兽企业重金招聘Python工程师标准>>>

Hello

设计学习应用,好记性不如烂笔头,强调不是学习和小试牛刀,通过几遍文章资料,通过几段固定的代码就可以把设计模式的思想掌握的很好(当然不排除在座的各位中有骨骼精奇万中无一的奇才,明显本座不是),主要将设计的思维领悟,能应用到自己的项目,或者是工作环境中,不然永远是虚把式,提升自我的思考层次.

设计模式,许多在代码层级,逻辑上都是有套路的,更多我们需要了解知道模式使用的场景、意义, 思维思考方式的转换.

以上废话都是鼓励自己用的,请大家跳过即可.

下面是将要逐步学习应用的 GOF23"四人帮" 的设计模式.

模式分类

创建型模式 :  ↓↓↓--单例模式,工厂模式,抽象工厂模式,建造者模式,原型模式.结构型模式 :  ↓↓↓--适配器模式,桥接模式,装饰模式,组合模式,外观模式,享元模式,代理模式.行为型模式 :  ↓↓↓--模版方法模式,命令模式,迭代器模式,观察者模式,中介者模式,备忘录模式,解释器模式,状态模式,策略模式,职责模式,访问者模式.

---------------------------以下开始本编内容---------------------------

单例模式

核心作用: 保证一个类中只有一个实例,并提供一个全局访问点.

只有一个实例,减少系统的开销,比如配置文件,其他API的依赖等,运行时只需要在内存中生成一份对象,而不需要每次去获取的时候new一个对象,多一份对象产生. 可以在全局设置访问点,优化资源访问.

朋友送我一只小狗,隔壁小妹妹想摸摸,我就拿给她摸摸,她很开心.楼上小姐姐想玩玩,我就抱给她玩玩,她也很开心.楼下大爷自己去抓狗溜,没有找我,当然是抓不到的了.

五种常见的方式

饿汉式

项目开始,不管后面会不会使用该类,类加载器都会加载该类

线程安全,调用率高,不能懒加载

1.需要有一个private的构造器,其他类无法调用其构造器初始化

2.还需要一个private static类变量并初始化

3.另外提供一个对外的public访问点,其他类只能在此处获取该对象

public class SingleZone {//类加载器加载,是线程安全的private static SingleZone single=new SingleZone();private SingleZone() {}public static SingleZone getSingle(){return single;}
}

懒汉式

线程安全,调用率不高,可以懒加载

1.需要有一个private的构造器,其他类无法调用其构造器初始化

2.还需要一个private static类变量不初始化

3.另外提供一个对外的public访问点,其他类只能在此处获取该对象

4.多线程情况下,在全局访问点(getSingle()方法)加上synchronized修饰,自然的并发效率会低一点

public class SingleOne {//定义不初始化private static SingleOne single;private SingleOne() {}//需要的时候才会初始化对象public synchronized static SingleOne getSingle(){if (single==null){single=new SingleOne();}return single;}
}

双重检测锁式(了解即可,参考)

public class SingleTwo {private static SingleTwo singleTwo=null;private SingleTwo(){}public SingleTwo getSingleTwo(){if (singleTwo==null){SingleTwo singleTwo1;synchronized (SingleTwo.class){singleTwo1=singleTwo;if (singleTwo1==null){synchronized (SingleTwo.class){if(singleTwo1==null){singleTwo1=new SingleTwo();}}}singleTwo=singleTwo1;}}return singleTwo;}
}

静态内部类式

线程安全,调用率高,可以延迟加载

1.外部类没有static定义和初始化,不会立即加载对象

2.只有需要时调用访问点,才能获取到对象,加载类是线程安全的

3.内部类有static (final)修饰,在内存内确保只有一份对象,只能被赋值一次,线程安全

4.具备并发,懒加载的优点

public class SingleThree {private SingleThree(){}//通过静态内部类初始化 SingleThree外部类private static class SingleInnerClass{private static final SingleThree singleThree=new SingleThree();}//需要的时候调用即可public SingleThree getSingleThree(){return SingleInnerClass.singleThree;}
}

枚举单例式

枚举元素本身是单例模式,没有懒加载,在JVM下,避免反射,反序列化的影响.

每一个枚举实例都是static final类型,表示只能被实例化一次,Java规范中规定,每一个枚举类型极其定义的枚举变量在JVM中都是唯一的,反序列化后的实例也会和之前被序列化的对象实例相同,保证枚举序列化单例.

public enum SingleFour {INSTANCE;//private Object ...//构造器SingleFour() {}//自定义操作public Object operation(){return "object";}
}

-------------------------------------------------------------

转载于:https://my.oschina.net/u/3829444/blog/1812282

设计模式(一) 单例模式相关推荐

  1. socket可以写成单例嘛_精读《设计模式 - Singleton 单例模式》

    Singleton(单例模式) Singleton(单例模式)属于创建型模式,提供一种对象获取方式,保证在一定范围内是唯一的. 意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 其实单例模 ...

  2. C#设计模式(1)——单例模式

    原文地址:http://www.cnblogs.com/zhili/p/SingletonPatterm.html 一.引言 最近在设计模式的一些内容,主要的参考书籍是<Head First 设 ...

  3. java设计模式之单例模式(七种方法)

    单例模式:个人认为这个是最简单的一种设计模式,而且也是在我们开发中最常用的一个设计模式. 单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个 ...

  4. java单例模式的七种写法_Java设计模式之单例模式的七种写法

    什么是单例模式? 单例模式是一种常见的设计模式,单例模式的写法有很多种,这里主要介绍三种: 懒汉式单例模式.饿汉式单例模式.登记式单例 . 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类 ...

  5. go设计模式之单例模式

    在这里插入图片描述# go设计模式之单例模式 在软件开发时,经常会遇到有些对象需要保证只有一个实例的,那么这种设计模式就应用而生. 定义 单例模式,也叫单子模式,是一种常用的软件设计模式,属于创建型模 ...

  6. 一篇博客读懂设计模式之---单例模式

    一篇博客读懂设计模式之---单例模式 一.  单例模式 单例对象(Singleton)是一种常用的设计模式.在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在.这样的模式有几个好处 ...

  7. Java 设计模式(3)单例模式

    前言 概念: java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自 ...

  8. socket可以写成单例嘛_精读设计模式 Singleton 单例模式

    Singleton(单例模式) Singleton(单例模式)属于创建型模式,提供一种对象获取方式,保证在一定范围内是唯一的. 意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 其实单例模 ...

  9. 设计模式之单例模式——Singleton

                        设计模式之单例模式--Singleton 设计意图: 保证类仅有一个实例,并且可以供应用程序全局使用.为了保证这一点,就需要这个类自己创建自己的对象,并且对外有 ...

  10. 实践GoF的设计模式:单例模式

    本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:单例模式>,作者: 元闰子. 简述 GoF 对单例模式(Singleton)的定义如下: Ensure a class onl ...

最新文章

  1. 第二章 数据类型和文件操作
  2. JAVA面向对象程序设计(第二版) 袁绍欣 第六章答案
  3. 前端基础-HTML的的标签详解
  4. linux远程工具_【linux实操3.1】linux远程连接工具Secure的使用
  5. linux mii,Linux mii-tool 命令用法详解-Linux命令大全(手册)
  6. Vsphere初试——基本安装
  7. grunt + compass
  8. 事务失败返回_分布式事务方案 TCC
  9. 【平面设计学习】Ai使用心得-扁平化制作
  10. iPhone6爆炸真是小概率事件吗?
  11. 2022深圳杯D题思路:复杂水平井三维轨道设计
  12. python输入直角三角形两条直角边、输出斜边长_用C++输入直角三角形的两条直角边长,调用平方根函数sqrt来求斜边的长度。...
  13. 腾讯微博qq说说备份导出工具_软件推荐Day51 其他工具类 腾讯微博备份
  14. 《天下少年英雄》隐私政策
  15. 使用CMD打开证书管理实用程序
  16. 域用户指定计算机,什么是AD域,如何设置AD域用户仅登录到指定的计算机
  17. [POI2009]Lyz
  18. 怎么配置android远程服务器地址,在 Android studio 中 配置Gradle 进行 “动态编译期间,指定 远程服务器地址 ,生成多个安装包”...
  19. continue 当条件不问那么执行你所对比的这个参数
  20. 我的python爬虫自学之路

热门文章

  1. Oracle数据库的语句级读一致性
  2. 关于cisco与中兴三层设备ospf互连
  3. Liferay 集群 (fail-over)
  4. iOS 9音频应用播放音频之ios9音频基本功能
  5. Unity 游戏开发技巧集锦之创建部分光滑部分粗糙的材质
  6. Beaglebone Black的启动
  7. ubuntu 安装docker_Docker: 教程04 - (初始化安装之在 Ubuntu 安装Docker CE)
  8. Unigui 服务器解析php,如何正确使用uniGUI的HyperServer(负载均衡)功能
  9. win32api.keybd_event 怎么输入中文_6个输入法高效使用技巧,你知道几个?
  10. 怎么添加新项目到svn服务器,用eclipse+svn插件,上传新项目到svn服务器