java设计模式--单例模式
来源:互联网 发布:淘宝网怎么搜索店铺 编辑:程序博客网 时间:2024/05/20 21:59
学习设计模式之前首先需要了解:
★:为什么要学习设计模式
1、设计模式都是一些相对优秀的解决方案,很多问题都是典型的、有代表性的问题,学习设计模式,我们就不用自己从头来解决这些问题,相当于在巨人的肩膀上,复用这些方案即可。
2、设计模式已经成为专业人士的常用词汇,不懂不利于交流。
3、能让你设计的系统更加专业,让系统有更好的架构。
单例设计模式
解决:保证了一个类在内存中只能有一个对象。
那么我们应该怎么做才能保证这个对象是唯一的呢?
思路: 1、如果其他程序能够随意用new创建该类对象,那么就无法控制个数。因此,不让其他程序用new创建该类的对象。
2、既然不让其他程序new该类对象,那么该类在自己内部就要创建一个对象,否则该类就永远无法创建对象了。
3、该类将创建的对象对外(整个系统)提供,让其他程序获取并使用。
步骤: 1、 将该类中的构造函数私有化。
2、在本类中创建一个本类对象。
3、定义一个方法,返回值类型是本类类型。让其他程序通过该方法就可以获取到该类对象。
实现方法1.饱汉式(直接加载模式)
class Single{private static final Single s = new Single();private Single(){ }public static Single getInstance(){ return s;}}
测试:
@Testpublic void t1() {Single s1 = Single.getInstance();Single s2 = Single.getInstance();System.out.println(s1);System.out.println(s2);//看输出的地址是否一致}测试结果:
cn.hncu.pattern.singleton.Single@4b9e2380cn.hncu.pattern.singleton.Single@4b9e2380
class Single2 {//饿汉式private static Single2 s=null;private Single2(){}//public static Single2 getInstance(){///*// * 当多线程调用时,此处可能会产生BUG// * 会出现new多次的bug,可以使用线程的安全优化synchronized// *///if(s==null){//s=new Single2();//}//return s;//}public static synchronized Single2 getInstSingle2(){if(s==null){s=new Single2();}return s;}}测试:
@Testpublic void t2() {Thread ts[] = new Thread[50];//开50个线程for(int i=0;i<ts.length;i++){ts[i] = new UseSingle();}for(int i=0;i<ts.length;i++){ts[i].start();}//为了能产生线程同时调用getInstance()中的s=new Single2(),线程启动后,让它"睡一下"try {Thread.sleep(20);} catch (InterruptedException e) {e.printStackTrace();}}class UseSingle extends Thread{@Overridepublic void run() {try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}Single2 s = Single2.getInstance();System.out.println(s);}}
1.当没有使用synchronized时:
cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@12b43967cn.hncu.pattern.singleton.Single2@12b43967cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223
---可以明显的看到有几个地址是不一样的。
2.当使用了synchronized时:
cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223cn.hncu.pattern.singleton.Single2@4173b223--可以明显的看到所有的对象地址都是一样的
阅读全文
1 0
- java 设计模式,单例设计模式
- java设计模式-单例设计模式
- java设计模式-单例设计模式
- Java设计模式 单例设计模式
- Java设计模式------单例设计模式
- java设计模式----->单例设计模式
- java设计模式:单例设计模式
- java设计模式-----单例设计模式
- Java设计模式----单例设计模式
- java设计模式-单例设计模式
- java设计模式:单例设计模式
- java 设计模式-单例设计模式
- Java设计模式--单例设计模式
- java设计模式---单例设计模式
- Java设计模式-单例设计模式
- JAVA设计模式:单例设计模式
- java-单例设计模式
- Java设计|单例模式
- 计算机网络——简单的端口扫描器
- ST算法解RMQ模板(洛谷1816 忠诚)
- 访问控制
- 阿里巴巴js面试题1
- 微信公众号接入服务端node.js中
- java设计模式--单例模式
- 【论文笔记】 R2CNN: Rotational Region CNN for Orientation Robust Scene Text Detection
- Linux crontab 命令用法
- Arcgis for Android离线数据下载
- 原根
- 51nod 1163 最高的奖励
- java-菱形实现
- 1. 打印100~200 之间的素数 2. 输出乘法口诀表 3. 判断1000年---2000年之间的闰年
- 牛客网SQL实战练习(1)