设计模式(一) 单例模式
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
设计模式(一) 单例模式相关推荐
- socket可以写成单例嘛_精读《设计模式 - Singleton 单例模式》
Singleton(单例模式) Singleton(单例模式)属于创建型模式,提供一种对象获取方式,保证在一定范围内是唯一的. 意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 其实单例模 ...
- C#设计模式(1)——单例模式
原文地址:http://www.cnblogs.com/zhili/p/SingletonPatterm.html 一.引言 最近在设计模式的一些内容,主要的参考书籍是<Head First 设 ...
- java设计模式之单例模式(七种方法)
单例模式:个人认为这个是最简单的一种设计模式,而且也是在我们开发中最常用的一个设计模式. 单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个 ...
- java单例模式的七种写法_Java设计模式之单例模式的七种写法
什么是单例模式? 单例模式是一种常见的设计模式,单例模式的写法有很多种,这里主要介绍三种: 懒汉式单例模式.饿汉式单例模式.登记式单例 . 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类 ...
- go设计模式之单例模式
在这里插入图片描述# go设计模式之单例模式 在软件开发时,经常会遇到有些对象需要保证只有一个实例的,那么这种设计模式就应用而生. 定义 单例模式,也叫单子模式,是一种常用的软件设计模式,属于创建型模 ...
- 一篇博客读懂设计模式之---单例模式
一篇博客读懂设计模式之---单例模式 一. 单例模式 单例对象(Singleton)是一种常用的设计模式.在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在.这样的模式有几个好处 ...
- Java 设计模式(3)单例模式
前言 概念: java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自 ...
- socket可以写成单例嘛_精读设计模式 Singleton 单例模式
Singleton(单例模式) Singleton(单例模式)属于创建型模式,提供一种对象获取方式,保证在一定范围内是唯一的. 意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 其实单例模 ...
- 设计模式之单例模式——Singleton
设计模式之单例模式--Singleton 设计意图: 保证类仅有一个实例,并且可以供应用程序全局使用.为了保证这一点,就需要这个类自己创建自己的对象,并且对外有 ...
- 实践GoF的设计模式:单例模式
本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:单例模式>,作者: 元闰子. 简述 GoF 对单例模式(Singleton)的定义如下: Ensure a class onl ...
最新文章
- 第二章 数据类型和文件操作
- JAVA面向对象程序设计(第二版) 袁绍欣 第六章答案
- 前端基础-HTML的的标签详解
- linux远程工具_【linux实操3.1】linux远程连接工具Secure的使用
- linux mii,Linux mii-tool 命令用法详解-Linux命令大全(手册)
- Vsphere初试——基本安装
- grunt + compass
- 事务失败返回_分布式事务方案 TCC
- 【平面设计学习】Ai使用心得-扁平化制作
- iPhone6爆炸真是小概率事件吗?
- 2022深圳杯D题思路:复杂水平井三维轨道设计
- python输入直角三角形两条直角边、输出斜边长_用C++输入直角三角形的两条直角边长,调用平方根函数sqrt来求斜边的长度。...
- 腾讯微博qq说说备份导出工具_软件推荐Day51 其他工具类 腾讯微博备份
- 《天下少年英雄》隐私政策
- 使用CMD打开证书管理实用程序
- 域用户指定计算机,什么是AD域,如何设置AD域用户仅登录到指定的计算机
- [POI2009]Lyz
- 怎么配置android远程服务器地址,在 Android studio 中 配置Gradle 进行 “动态编译期间,指定 远程服务器地址 ,生成多个安装包”...
- continue 当条件不问那么执行你所对比的这个参数
- 我的python爬虫自学之路
热门文章
- Oracle数据库的语句级读一致性
- 关于cisco与中兴三层设备ospf互连
- Liferay 集群 (fail-over)
- iOS 9音频应用播放音频之ios9音频基本功能
- Unity 游戏开发技巧集锦之创建部分光滑部分粗糙的材质
- Beaglebone Black的启动
- ubuntu 安装docker_Docker: 教程04 - (初始化安装之在 Ubuntu 安装Docker CE)
- Unigui 服务器解析php,如何正确使用uniGUI的HyperServer(负载均衡)功能
- win32api.keybd_event 怎么输入中文_6个输入法高效使用技巧,你知道几个?
- 怎么添加新项目到svn服务器,用eclipse+svn插件,上传新项目到svn服务器