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


实现方法2.饿汉式(延迟加载模式)

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
--可以明显的看到所有的对象地址都是一样的





原创粉丝点击