一、普通单利
二、synchronized单利
三、影子追踪测试
①普通单利
package com.dasenlin.singleton;
/**
* 单利模式
* 单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。这样的模式有几个好处:
* 1、某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销。
* 2、省去了new操作符,降低了系统内存的使用频率,减轻GC压力。
* 3、有些类如交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了。
* (比如一个军队出现了多个司令员同时指挥,肯定会乱成一团),所以只有使用单例模式,才能保证核心交易服务器独立控制整个流程。
* @author Administrator
* 如果在构造函数中抛出异常,实例将永远得不到创建,也会出错。所以说,十分完美的东西是没有的,我们只能根据实际情况,选择最适合自己应用场景的实现方法。
* 也有人这样实现:因为我们只需要在创建类的时候进行同步,所以只要将创建和getInstance()分开,单独为创建加synchronized关键字,也是可以的:
*/
public class Singleton {
/**
* 私有化构造方法
*/
private Singleton(){
}
/**
* 此处使用一个静态内部类来维护单例
*/
private static class SingletonFatory{
private static Singleton instance = new Singleton();
}
/**
* 获取实例
* @return
*/
public static Singleton getInstance(){
return SingletonFatory.instance;
}
/**
* 若对象被序列化,可以保证前后实例的是一样的
* @return
*/
public Object readResolve(){
return getInstance();
}
public void say(){
System.out.println("单例模式实例化成功后加载的一个方法");
}
}
②synchronized单例
package com.dasenlin.singleton;
/**
* 单例类比较灵活,毕竟从实现上只是一个普通的Java类,只要满足单例的基本需求,你可以在里面随心所欲的实现一些其它功能,但是静态类不行。
* 从上面这些概括中,基本可以看出二者的区别,但是,从另一方面讲,我们上面最后实现的那个单例模式,内部就是用一个静态类来实现的,
* 所以,二者有很大的关联,只是我们考虑问题的层面不同罢了。两种思想的结合,才能造就出完美的解决方案,就像HashMap采用数组+链表来实现一样,
* 其实生活中很多事情都是这样,单用不同的方法来处理问题,总是有优点也有缺点,
* 最完美的方法是,结合各个方法的优点,才能最好的解决问题!
* @author Administrator
*/
public class Singleton2 {
/**
* 单独提出静态类常量
*/
private static Singleton2 instance=null;
/**
* 私有化构造方法
*/
private Singleton2(){
}
/**
* 同步线程安全的实例
*/
private static synchronized void syncInit(){
if(null==instance){
instance =new Singleton2();
}
}
/**
* 提供公共的方法让外部实例化该类
* @return
*/
public static Singleton2 getInstance(){
if(null==instance){
syncInit();
}
return instance;
}
/**
* 类中方法
*/
public void say(){
System.out.println("这是第第二种单利提出到工厂外实例");
}
}
③影子追踪测试
package com.dasenlin.singleton;
import java.util.Vector;
public class SingletonTest {
private static SingletonTest instance = null;
private Vector properties = null;
public Vector getProperties() {
return properties;
}
private SingletonTest() {
}
private static synchronized void syncInit() {
if (instance == null) {
instance = new SingletonTest();
}
}
public static SingletonTest getInstance() {
if (instance == null) {
syncInit();
}
return instance;
}
public void updateProperties() {
SingletonTest shadow = new SingletonTest();
properties = shadow.getProperties();
}
}
/**
* 测试类
* @author Administrator
*
*/
public class Test{
public static void main(String[] args) {
Singleton sin=Singleton.getInstance();
sin.say();
Singleton2 sin2=Singleton2.getInstance();
sin2.say();
SingletonTest sin3=SingletonTest.getInstance();
sin3.updateProperties();
}
}
java设计模式,单利模式
最新推荐文章于 2024-05-14 06:46:22 发布