Java编程算法基础--单例模式

《设计模式》中的经典模式并不是用来照搬的,实际工程中往往是取其思想,使用“变种”,或多个模式的混合体。

其中的“单例模式”,最为简单,容易理解,变种少。

“单例模式”要解决的问题是:如何能在源头上保证一个类将来不会创建多个实例。

 

应在若干项目经验后,再研读设计模式

 

 

package NO3;
class T{
	
}
public class Test07 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
       new T();
       new T();
	}

}

在上面这种情况下,对类进行实例化的权利在类的外部,类本身不能阻止创建多个实例

---------->需要将决定权收回到类本身

第一步:         把构造方法禁止掉,因为都new一个实例,都要用到构造方法,将构造方法设为private,则类外部访问不到

<span style="color:#000000;">package NO3;
class T{
	
	private T(){
		
	}
}
public class Test07 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
      
	}

}
</span>


 

 

 

 

 

第二步:         创建对象工作的一个转移,由外部创建转向内部创建

 

package NO3;
class T{
	
	private T(){
		
	}
	public static T getInstance(){//实现了创建对象工作的转移,由外部转向了内部
		return new T(); //在类的内部可以访问到构造方法
	}
}
public class Test07 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
           T a = T.getInstance(); 
           T b = T.getInstance();//此时还是可以创建多个实例     
	}

}


第三步: 防止第二次创建实例,懒惰方式(懒汉方式)

 

package NO3;
class T{
	private static T t;//在类的内部存储一个唯一的实例
	private T(){
		
	}
	public static T getInstance(){
		
		if(t == null)  //懒惰方式,当对象第一次使用的时候才被初始化
			t = new T();
		return t;
	}
}
public class Test07 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
        T a = T.getInstance();
        T b = T.getInstance();
		
        System.out.println(a == b);
        //输出为 true 	}

}

第三步:   防止第二次创建实例,  初始化风格(饿汉方式)

<span style="color:#000000;">package NO3;
//当类在加载的时候立刻去创建它的实例对象
//这种方式适用于那些比较复杂的资源,因为它们创建所要耗费的时间比较多
class T{
	private static T t;//在类的内部存储一个唯一的实例
	static{ //静态块, 当类加载时候,立即去执行静态块中的内容
		t = new T();
	}
	private T(){
		
	}
	public static T getInstance(){
		
		return t;
	}
}
public class Test08 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
	      T a = T.getInstance();
	      T b = T.getInstance();
			
	      System.out.println(a == b);
		
	}

</span><span style="color:#000000;">}
</span>

 

对重量级对象应用饿汉模式,类加载时速度慢,但运行时速度快;懒汉模式则与之相反,类加载时速度快,但运行时第一次获得对象的速度慢。

 

单例模式的变种: 少例  只容许两个或三个实例存在

 

注意:以下代码不完整

<span style="color:#000000;">package NO3;

import java.util.List;
class T{
	private static T t;//在类的内部存储一个唯一的实例
</span>
<span style="color:#000000;">        private static T t2;
        //private static T t3;   </span>
<span style="color:#000000;">	private static List list;
</span>
<span style="color:#000000;">        //生成一个List来存储T对象</span>
<span style="color:#000000;"></span> 
<span style="color:#000000;">	private T(){
		
	}
	public static T getInstance(){
		
		if(t == null)  //懒惰方式,当对象第一次使用的时候才被初始化
			t = new T();
		return t;
	}
}
public class Test07 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
        T a = T.getInstance();
        T b = T.getInstance();
		
        System.out.println(a == b);
	}

}
</span>


 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值