天天看点

[Java基础]-- java单例模式

一、单例模式

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());
}
}      

四、优缺点

  • 1、提供了对唯一实例的受控访问。
  • 2、由于在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能。
  • 3、允许可变数目的实例。
  • 1、由于单例模式中没有抽象层,因此单例类的扩展有很大的困难。
  • 2、单例类的职责过重,在一定程度上违背了“单一职责原则”。
  • 3、滥用单例将带来一些负面问题,如为了节省资源将​​数据库​​连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;如果实例化的对象长时间不被利用,系统会认为是垃圾而被回收,这将导致对象状态的丢失。