java单例模式
2015-11-18 12:06
591 查看
一、单例模式
java是一种静态语言,java中单例模式是一种常见的设计模式,单例模式有2种:(1)懒汉式单例、(2)饿汉式单例、(3)登记式单例。
二、单例模式特点:
1、单例类只能有一个实例。
2、单例类必须自己自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
三、3种单例模式
1、饿汉式
/**
*
*@类功能说明:饿汉式单例模式
*@修改人员名: yang
*@修改日期: 2015-11-18 下午01:33:55
*@修改内容:
*@修改次数:
*@创建时间: 2015-11-18 下午01:33:55
*@版本:V1.0
*/
public class TestInstence {
//私有化构造方法
private TestInstence(){}
//自己实例化
private static final TestInstence testInstence=new TestInstence();
//静态方法
public static TestInstence getInstence(){
return testInstence;
}
//测试
public static void main(String args[]){
TestInstence ts=new TestInstence();
System.out.println(ts);
}
}
2、懒汉式
/**
*
*@类功能说明:测试懒汉式单例模式
*@修改人员名: yang
*@修改日期: 2015-11-18 下午01:42:31
*@修改内容:
*@修改次数:
*@创建时间: 2015-11-18 下午01:42:31
*@版本:V1.0
*/
public class TestInstenceLazy {
//私有化构造方法
private TestInstenceLazy(){}
//自己实例化,不用final修饰
private static TestInstenceLazy testLazy=null;
//提供方法
public synchronized static TestInstenceLazy getLazy(){
//判断是否已经有对象
if(testLazy!=null){
testLazy=new TestInstenceLazy();
}
return testLazy;
}
//测试
public static void main(String args[]){
TestInstenceLazy ts=new TestInstenceLazy();
System.out.println(ts);
}
}
3、登记模式
import java.util.HashMap;
import java.util.Map;
/**
*
*@类功能说明:登记式单例模式
*@修改人员名: yang
*@修改日期: 2015-11-18 下午04:57:02
*@修改内容:
*@创建时间: 2015-11-18 下午04:57:02
*@版本:V1.0
*/
public class TestInstenceRegister {
private static Map<String, TestInstenceRegister> map = new HashMap<String, TestInstenceRegister>();
// 静态代码块,保证只初始化一次
static {
TestInstenceRegister tig = new TestInstenceRegister();
map.put(tig.getClass().getName(), tig);
}
// 保护构造方法
protected TestInstenceRegister() {}
// 静态方法,返回唯一的实例对象
public static TestInstenceRegister getInstence(String name) {
if (name == null) {
name = TestInstenceRegister.class.getName();
System.out.println("name == null" + "--->name=" + name);
}
if (map.get(name)==null) {
try {
map.put(name, (TestInstenceRegister) Class.forName(name).newInstance());
} catch (Exception e) {
e.printStackTrace();
}
}
//返回根据键得到的值对象
return map.get(name);
}
//例子
public String test(){
return "testName";
}
//测试
public static void main(String args[]){
TestInstenceRegister tig=TestInstenceRegister.getInstence(null);
System.out.println("类加载后的map结果:"+map);
System.out.println("调用方法后的结果:"+tig.test());
}
}
java是一种静态语言,java中单例模式是一种常见的设计模式,单例模式有2种:(1)懒汉式单例、(2)饿汉式单例、(3)登记式单例。
二、单例模式特点:
1、单例类只能有一个实例。
2、单例类必须自己自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
三、3种单例模式
1、饿汉式
/**
*
*@类功能说明:饿汉式单例模式
*@修改人员名: yang
*@修改日期: 2015-11-18 下午01:33:55
*@修改内容:
*@修改次数:
*@创建时间: 2015-11-18 下午01:33:55
*@版本:V1.0
*/
public class TestInstence {
//私有化构造方法
private TestInstence(){}
//自己实例化
private static final TestInstence testInstence=new TestInstence();
//静态方法
public static TestInstence getInstence(){
return testInstence;
}
//测试
public static void main(String args[]){
TestInstence ts=new TestInstence();
System.out.println(ts);
}
}
2、懒汉式
/**
*
*@类功能说明:测试懒汉式单例模式
*@修改人员名: yang
*@修改日期: 2015-11-18 下午01:42:31
*@修改内容:
*@修改次数:
*@创建时间: 2015-11-18 下午01:42:31
*@版本:V1.0
*/
public class TestInstenceLazy {
//私有化构造方法
private TestInstenceLazy(){}
//自己实例化,不用final修饰
private static TestInstenceLazy testLazy=null;
//提供方法
public synchronized static TestInstenceLazy getLazy(){
//判断是否已经有对象
if(testLazy!=null){
testLazy=new TestInstenceLazy();
}
return testLazy;
}
//测试
public static void main(String args[]){
TestInstenceLazy ts=new TestInstenceLazy();
System.out.println(ts);
}
}
3、登记模式
import java.util.HashMap;
import java.util.Map;
/**
*
*@类功能说明:登记式单例模式
*@修改人员名: yang
*@修改日期: 2015-11-18 下午04:57:02
*@修改内容:
*@创建时间: 2015-11-18 下午04:57:02
*@版本:V1.0
*/
public class TestInstenceRegister {
private static Map<String, TestInstenceRegister> map = new HashMap<String, TestInstenceRegister>();
// 静态代码块,保证只初始化一次
static {
TestInstenceRegister tig = new TestInstenceRegister();
map.put(tig.getClass().getName(), tig);
}
// 保护构造方法
protected TestInstenceRegister() {}
// 静态方法,返回唯一的实例对象
public static TestInstenceRegister getInstence(String name) {
if (name == null) {
name = TestInstenceRegister.class.getName();
System.out.println("name == null" + "--->name=" + name);
}
if (map.get(name)==null) {
try {
map.put(name, (TestInstenceRegister) Class.forName(name).newInstance());
} catch (Exception e) {
e.printStackTrace();
}
}
//返回根据键得到的值对象
return map.get(name);
}
//例子
public String test(){
return "testName";
}
//测试
public static void main(String args[]){
TestInstenceRegister tig=TestInstenceRegister.getInstence(null);
System.out.println("类加载后的map结果:"+map);
System.out.println("调用方法后的结果:"+tig.test());
}
}
相关文章推荐
- QQ消息拉一拉消失和如何在Eclipse导入gethub中下载的文件
- java类加载详解
- Windows下使用Java调用ElasticSearch提供的相关API进行数据搜索完整实例演示
- intellij IDEA 15.0破解到运行第一个javaweb实例
- JAVA 字符串分割split 的用法注意
- webSocket 简单实例
- Eclipse中设置keystone提示:Keystore was tampered with, or password was incorrect
- Java svn提交报错"out of date"
- java二进制反序列化与序列化
- Java俄罗斯方块代码(转载)
- java intelliJ eclipse 配置文件处理的一点区别
- 排序算法JAVA实现一
- Java 8里面lambda的最佳实践
- Java集合Collection
- java中Map和List初始化的两种方法
- 继续java基础刷题
- SSH:Spring框架(spring之AOP)
- JAVA 中BIO,NIO,AIO的理解
- 详解SpringMVC中Controller的方法中参数的工作原理
- Junit测试出现异常:Exception in thread "main" java.lang.NoSuchMethodError: org.junit.runner.Description.cre