黑马程序员—单例模式的设计
设计模式:所谓模式即解决某一类问题最行之有效的解决方案,在JAVA中有23种设计模式,分别为:
创建型模式:单例模式、抽象工厂模式、建造者模式、工厂模式、原型模式。
结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。
行为型模式:模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、模式、访问者模式。
单例设计模式:保证一个类的实例可以有且只可以有一个,
即保证一个类在内存中只存在一个对象,避免其他程序过多建立对象
解决思路:
1.先禁止其他程序建立该类对象
2.在本类中自定义一个对象
3.对外提供访问方式
代码实现:
1.将构造函数私有化
2.在类中创建一个本类对象
3.提供一个方法可以获取该对象,
注:既然不能在其他类创建该类的对象,所以只能在本类中创建本类对象,
即对于对外提供获取该对象的方法调用两种途径:1.对象;2.类名;只能选择用类名调用,
所以该方法应为static修饰,同理静态方法访问的类内部成员也应为静态。
class Single
{private Single(){}private static Single s = new Single();public static Single getInstance(){return s;}
}
class SingleDemo
{public static void main(String[] args){Single s = Single.getInstance();}
}
---------------------------------------------------------
----------------------------------------------------------
用以下测试程序验证:
class Single
{private int num;public void setNum(int num){ this.num = num;}public int getNum(){return num;}private Single(){}private static Single s = new Single();//先初始化对象,称为饿汉式public static Single getInstance(){return s;}
}
class SingleDemo
{public static void main(String[] args){Single s1 = Single.getInstance();Single s2 = Single.getInstance();s1.setNum(23);System.out.print(s2.getNum());}
}
输出结果为:23,即 由于使用单例模式,所以s1和s2指向同一个堆内存中的对象。
这种设计单例模式在Single类一进内存,就在堆内存中创建对象 ,所以称之为饿汉式
单例另一种形式:
class Single
{private static Single s = null;private Single(){}public static Single getInstance(){if(s == null)s = new Single();return s;}
}
这种单例设计模式在getInstance()方法被调用才进行对象初始化,即对象延时加载,所以称之为懒汉式
懒汉式在多线程中存在的安全问题,即当A程序执行完 if(s == null) 判断后,切换到另一个线程,则调用该方法的B程序此时将创建一个Single对象,
当A程序再次获得CPU的执行权时,不再进行if(s == null) 判断就直接创建该类对象!!
单例模式的第三种形式:
<pre name="code" class="java">class Single
{private static Single s = null;private Single(){}public static Single getInstance(){if(s == null)synchronized(Single.class){if(s==null)s = new Single();}return s;}
}
双重锁形式,加了synchronized关键字,即解决了多线程情况下的安全问题,又由于采用双重判断方式避免了直接将synchronized加在方法名上所导致的低效问题,即public static synchronized Single getInstance()。
小结:实际开发一般用饿汉式,虽然类一加载就创建对象,但是单例模式的设计就是为了保证对象的唯一性,
也就是说就是需要用到这个类的实例对象。
黑马程序员—单例模式的设计相关推荐
- python设计游戏的背景_04_游戏背景 — 黑马程序员《Python入门教程完整版》笔记...
游戏背景 黑马程序员<Python入门教程完整版>笔记 - 黑马程序员<Python入门教程完整版>笔记 目标背景交替滚动的思路确定 显示游戏背景 01. 背景交替滚动的思路确 ...
- 《MySQL数据库原理、设计与应用》课后习题及答案 黑马程序员编著
<MySQL数据库原理.设计与应用>课后习题及答案 黑马程序员编著 答案有文档形式,但是csdn必须要下载,,需要的人就去那里下载吧.<MySQL数据库原理.设计与应用>课后习 ...
- 黑马程序员UI设计学院公开课,10月18日开讲啦!
揭秘网红照"骗"的那点秘密公开课,重磅来袭! 本期导读: 如今的大众文化圈,已经不再单纯.平民狂欢造就一茬又一茬的网络红人.这是多元的时代使然,不修片不发图,充斥在互联网上的网红的 ...
- 黑马程序员,黑马论坛-------单例模式的两种实现(恶汉+懒汉)
文章来源:黑马程序员,黑马论坛 单列模式的实现主要有两种:饿汉式单例类和懒汉式单例类 1)饿汉式单例类 代码清单1:饿汉式单例类 public class EagerSingleton{ privat ...
- 黑马程序员入学Java知识——精华总结
黑马程序员入学Java知识--精华总结 J2SE部分,Java高新技术部分,7K面试题部分等黑马入学要求的知识点总结! 一.黑马程序员-java概述与基础知识 6 1.何为编程? 6 2.Java语言 ...
- [学习笔记]黑马程序员python教程
文章目录 思维导图 Python基础知识图谱 面向对象 SQL入门和实战 Python高阶技巧 第一阶段 第九章:Python异常.模块与包 1.9.1异常的捕获 1.9.1.1 为什么要捕获异常 1 ...
- SSM 框架学习(黑马程序员)
(Spring+SpringMVC+MyBatis) SSM框架教程 黑马程序员最全SSM框架教程|Spring+SpringMVC+MyBatis全套教程 01. Spring 简介 1.1 Spr ...
- python从入门到高阶(基于黑马程序员python教程)
文章目录 0.文章来源 1."学it就来%s%s员"% (name,"程序员") 2.%s:占位字符串.%d:占位整型.%f:占位浮点型 3.字符串格式化的精度 ...
- python实训项目-黑马程序员上海校区Python21期Django项目实训
黑马程序员上海中心 月薪一万只是起点 关注 晚上十点,一名名Python学生正在酣畅淋漓地撸代码,手指不间断地敲击着键盘,发出机械而清脆的声音. 各个小组在经过为期4天的django项目小组开发,终于 ...
最新文章
- 用户态下init进程1的执行
- R语言-处理异常值或报错的三个示例
- 支付宝的kill-ie
- git rm–r folder/file fatal:pathspec did not match any files
- C# WinForm 添加Windows Media Player 控件调试出现未能加载文件或程序集Interop.WMPLib,该怎么解决...
- python算法与数据结构-希尔排序算法(35)
- pmp每日三题(2022年3月1日)
- 数据库为啥要使用参数绑定?
- 《Java基础学习笔记》JAVA面向对象之封装
- Java selenium和python_c#和Java和python设置selenium超时时间
- 安装mysql报curses的解决
- linux 软件包安装管理
- 浅谈御剑web指纹识别-CMS指纹识别
- *使用phpspider -- PHP蜘蛛爬虫框架来爬取数据
- c语言程序设计小球弹跳,C语言实现弹跳小球
- 4.智能快递柜(通信篇-SOCKET)
- pixhawk源码下载与编译
- 没有计算的推理和基于推理的计算 逻辑与算法之五
- 微星GS65 英雄联盟崩溃
- tcp/ip的模型与原理
热门文章
- Linux学习笔记(一)(服务器环境搭配 常用命令 文件属性)
- lol服务器维护 胜率,英雄联盟:服务器当真会强行平衡胜率,玩家连胜之后必定连跪?...
- C++中的swap()函数
- 创造一切条件让大家“混”
- 军工计算机工业主板,6U紧凑军用CPCI工控机主板cPCI-6940系列
- MATLAB1770太阳黑子,太阳黑子周期matlab仿真
- 求你不要在工作时间刷课了
- Vue.js 作者在 VueConf 2019 上海演讲视频
- GraphPad Prism软件计算IC50与作图
- [珍藏] 易语言老论坛发言排行榜