毕向东学习视频08_04-面向对象(单例设计模式-概述&体现).avi
如果不保证对象唯一性:输出 10 14
如果保证了对象唯一性:输出 14 14
package day08;
/*
如何保证对象唯一性?
1.不允许其他程序用new创建该类对象。
2.在该类中创建一个本类实例。
3.对外提供一个方法让其他程序可以获取该对象。
步骤:
1.私有化该类的构造函数。
2.通过New在本类中创建一个对象。
3.定义一个公有的方法,将创建的对象返回。
*/
class Single {
private int num;
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
//以上是普通的函数
//以下5行实现 对象唯一性
static Single s = new Single(); //创建本类类型
private Single(){}//私有化构造函数
public static Single getS(){//获取
return s;
}
}
public class SingleDemo {
public static void main(String[] args) {
//Single ss = Single.getS();//可控
//Single s = Single.s;//不可控
Single t1 = Single.getS();
Single t2 = Single.getS();
//如果不需要保证对象唯一性 不能按照上面两行调用方式
// 把Single类中的对象唯一性部分去掉后 再改为:
//Single t1 = new Single();
//Single t2 = new Single();
t1.setNum(10);
t2.setNum(14);
System.out.println(t1.getNum());
System.out.println(t2.getNum());
}
}
面试几乎都是问延迟加载的模式 即 懒汉式
一般应用的时候都是用饿汉式
懒汉式存在安全隐患 在多线程运用时
//饿汉式
class Single//类一加载,对象就已经存在了。
{
private static Single s = new Single();
private Single(){}
public static Single getInstance()
{
return s;
}
}
//懒汉式
class Single2//类加载进来,没有对象,只有调用了getInstance方法时,才会创建对象。
//延迟加载形式。
{
private static Single2 s = null;
private Single2(){}
public static Single2 getInstance()
{
if(s==null)
s = new Single2();
return s;
}
}
2016.6.26日
学习多线程后
//懒汉式
class Single2//类加载进来,没有对象,只有调用了getInstance方法时,才会创建对象。
//延迟加载形式。
{
private static Single2 s = null;
private Single2(){}
public static Single2 getInstance()
{
if(s==null){//解决了效率问题,一旦创建了一个对象后,就不会在重复要锁了
synchronized(Single.class)//同步代码块解决了安全性问题
{
if(s==null)
s = new Single2();
}
return s;
}
}
}