java常用设计模式(一)——单例设计模式(SingleTon)

一.什么是单例设计模式?

1.引子

在某些情况下,我们可能需要某个类只能创建出一个对象,即不让用户用该类实例化出多于两个的实例。
例如:在一个公文管理系统中,公文类的实例“公文文件”,需要将公章类的实例作为自己的一个成员,且公章类只有一个实例

2.概念

单例设计模式 就可以完美的解决上述问题,它通过保证一个类仅有一个实例,并只提供一个可以访问它的全局访问点来保证实例的唯一性,该模式的关键是将类的构造方法设置为private权限,并提供一个返回它的唯一实例的类方法。

3.设计思想

a. 构造方法私有化
b. 提供一个私有的静态的当前类(该单例类)的对象作为其内部的属性
c. 提供一个公有的静态的方法用于获取当前类的对象(以供外界访问来获取唯一的对象)

4.单例模式的实现方式

常用的有饿汉式和懒汉式两种

二.代码实现

1.饿汉式设计模式:

java代码如下:

package 单例设计模式;
/**
* @author juhao
* * 单例设计模式:解决对象全局唯一性的问题。 
* 1.构造方法私有 
* 2.提供一个私有的静态的当前类的对象作为其内部的属性
* 3.提供一个公有的静态的方法用于获得当前类的对象啊
*///饿汉式
public class SingleTon {
   private static SingleTon st = new SingleTon();//饿汉式
   private SingleTon() {

   }

   public static SingleTon getInstance() {
   	System.out.println("恭喜你获得单例对象成功");
   	return st;
   }

   public void Test() {
   	System.out.println("Test正在执行。。。");
   }

}
2.懒汉(饱汉)式设计模式:

java代码如下:

package 单例设计模式;
/**
* @author juhao
* * 单例设计模式:解决对象全局唯一性的问题。 
* 1.构造方法私有 
* 2.提供一个私有的静态的当前类的对象作为其内部的属性
* 3.提供一个公有的静态的方法用于获得当前类的对象啊
*///饿汉式
public class SingleTon {

   private static SingleTon st;//懒汉式
   private SingleTon() {

   }

   public static SingleTon getInstance() {
   	
   	System.out.println("恭喜你获得对象成功");
   	if(st==null)
   		st=new SingleTon();//懒汉式
   	return st;
   }

   public void Test() {
   	System.out.println("Test正在执行。。。");
   }
}

懒汉式设计模式的缺点是,没有考虑到线程安全,可能存在多个访问者同时访问,并同时构造了多个对象的问题。之所以叫做懒汉模式,主要是因为此种方法可以非常明显的lazy loading。

针对懒汉模式线程不安全的问题,我们自然想到了,在getInstance()方法前加锁,于是就有了第二种实现。

public class SingleTon {

    private static SingleTon st;//懒汉式
	private SingleTon() {

	}

	public static synchronized  SingleTon getInstance() {
		
		System.out.println("恭喜你获得对象成功");
		if(st==null)
			st=new SingleTon();//懒汉式
		return st;
	}

	public void Test() {
		System.out.println("Test正在执行。。。");
	}
}

并发其实是一种特殊情况,大多时候这个锁占用的额外资源都浪费了,所以这种打补丁方式写出来的结构效率很低

三.总结

1.单例模式的优点:
它节省了内存的空间,单例类的唯一实例由单例类本身来控制,所以可以很好地控制用户何时访问它
2.单例模式的缺点:
由于其内部的一般属性因为对象的全局唯一而变得全局唯一,因为单例模式对象无法回收。所以其内部的属性也会无法释放
3.应用场景:
a.在Spring中创建的Bean实例默认都是单例模式存在的
b.当使用一些所有人共用信息的类的时候可以考虑使用单例模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值