单例模式-单例模式调用普通类,普通类也可以实现单例模式

本文介绍了一种使用静态内部类实现单例模式的方法,并通过构造方法实例化了一个普通类,实验证明该普通类同样实现了单例的效果。文章包含完整的代码示例和测试结果。

前言:

使用静态内部类实现单例模式,单例类内部通过构造方法实例化其他普通类,实验证明,普通类也实现了单例调用的效果


说明:

测试方法调用单例模式的类,单例模式的类调用普通类,测试类调用单例模式的类两次,单例模式的类金实例化一次,被单例模式调用的类也只实例化一次,

需要强调的是,普通类是放在单例模式的类的构造方法中实例化的,这样只有单例模式的类被实例化时,普通类才会实例化,从而也实现了单例模式。


贴代码:


单例模式的类

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





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值