前言:
使用静态内部类实现单例模式,单例类内部通过构造方法实例化其他普通类,实验证明,普通类也实现了单例调用的效果
说明:
测试方法调用单例模式的类,单例模式的类调用普通类,测试类调用单例模式的类两次,单例模式的类金实例化一次,被单例模式调用的类也只实例化一次,
需要强调的是,普通类是放在单例模式的类的构造方法中实例化的,这样只有单例模式的类被实例化时,普通类才会实例化,从而也实现了单例模式。
贴代码:
单例模式的类
package com.bestcxx.mavenstu.mavenssh.singolen;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
/**
*
* @theme 单例模式
* @author wujie
* @Datetime 2017年4月25日
* java 单例的实现方式:http://www.cnblogs.com/hupp/p/4487521.html
*
* Desc:使用静态内部类实现单例模式,单例类内部通过构造方法实例化其他普通类,
* 实验证明,普通类也实现了单例调用的效果
*
*/
public class SingolenStudy {
private static Logger logger = LogManager.getLogger(SingolenStudy.class);
private AnotherCommonClass a;
private SingolenStudy(){
logger.info("\nSingolenStudy.java 被实例化");
a=new AnotherCommonClass();
}
private static class SingletonHolder{
private final static SingolenStudy instance=new SingolenStudy();
}
public static SingolenStudy getInstance(){
return SingletonHolder.instance;
}
//添加该类的其他方法
public void method1(){
logger.info("\nSingolenStudy.java 的方法 method1");
a.method2();
}
}
普通类
package com.bestcxx.mavenstu.mavenssh.singolen;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
/**
*
* @theme 一个普通的类
* @author wujie
* @Datetime 2017年4月25日 上午10:43:29
* Desc:这只是一个普通的类
*/
public class AnotherCommonClass {
private static Logger logger = LogManager.getLogger(AnotherCommonClass.class);
public AnotherCommonClass(){
logger.info("\nAnotherCommonClass.java 被实例化");
}
public void method2(){
logger.info("\nAnotherCommonClass.java 的方法 method2");
}
}
测试类
package com.bestcxx.mavenstu.mavenssh.singolen;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.junit.Test;
/**
*
* @theme 单例模式测试-单例类调用普通类,普通类也可以实现单例的效果
* @author wujie
* @Datetime 2017年4月25日
*/
public class SingolenStudyTest {
private static Logger logger = LogManager.getLogger(SingolenStudyTest.class);
@Test
public void testMethod1(){
SingolenStudy.getInstance().method1();
/*注释掉的测试方法和上面效果一致*/
/*SingolenStudy s=SingolenStudy.getInstance();
s.method1();
*/
}
@Test
public void testMethod2(){
logger.info("\n开始第二次调用,可以看到,单例模式类和单例模式构造方法实例化的普通类都没有再次实例化");
SingolenStudy.getInstance().method1();
/*注释掉的测试方法和上面效果一致*/
/*SingolenStudy s=SingolenStudy.getInstance();
s.method1();*/
}
}
测试结果
SingolenStudy.java 被实例化
AnotherCommonClass.java 被实例化
SingolenStudy.java 的方法 method1
AnotherCommonClass.java 的方法 method2
开始第二次调用,可以看到,单例模式类和单例模式构造方法实例化的普通类都没有再次实例化
SingolenStudy.java 的方法 method1
AnotherCommonClass.java 的方法 method2
github代码
https://github.com/Bestcxy/SSH-ajax-axis2-maven-log4j-redis
包路径:
src/main/java/com.bestcxx.mavenstu.mavenssh.singolen
src/test/java/com.bestcxx.mavenstu.mavenssh.singolen
原创声明:欢迎转载,转载请声明出处 http://blog.youkuaiyun.com/bestcxx/article/details/70736340
本文介绍了一种使用静态内部类实现单例模式的方法,并通过构造方法实例化了一个普通类,实验证明该普通类同样实现了单例的效果。文章包含完整的代码示例和测试结果。
1382

被折叠的 条评论
为什么被折叠?



