Java设计模式其一【单例设计模式】


毕向东学习视频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;  
	  }  
  }
}  


你可能感兴趣的:(java,java设计模式)