您的位置:首页 > 编程语言 > Java开发

java单例模式 Singleton

2015-08-25 13:51 555 查看
java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。

  单例模式有一下特点:

  1、单例类只能有一个实例。

  2、单例类必须自己自己创建自己的唯一实例。

  3、单例类必须给所有其他对象提供这一实例。

  单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。总之,选择单例模式就是为了避免不一致状态,避免政出多头。

//(1)单例模式:饿汉式--------------
public class Singleton {
//私有,静态的类自身实例
private static Singleton instance = new Singleton();

//私有无参构造
private Singleton(){}

//公开,静态工场方法
public static Singleton getInstance(){
return instance;
}
}
//使用时 Singleton obj = Singleton.getInstance;


//(2)单例模式:懒汉式------------------
public class LazySingleton {
//初始为null,暂不实例化
private static LazySingleton instance= null;

//私有无参构造
private LazySingleton(){}

//公开,静态工场方法,需要使用时才创建该对象
public static LazySingleton getInstance(){
if(instance==null){
instance = new LazySingleton();
}
return instance;
}
}
//使用时跟上面例子一样 LazySingleton obj = LazySingleton.getInstance;


package day0825singleton;

public class TestStream {
private String name;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

//该类只能有一个实例
private TestStream(){}

//该类必须自行创建
//有2种方式
//private static final TestStream ts = new TestStream();//方式1

//方式2:
private static TestStream ts = null;

//该类必须自动向整个系统提供这个实例对象
public static TestStream getTest(){
if(ts==null){
ts = new TestStream();
}
return ts;
}

public void getInfo(){
System.out.println("name:"+name);
}
}


package day0825singleton;

public class TestMain {

public static void main(String[] args) {
TestStream ts = TestStream.getTest();
ts.setName("张三");
System.out.println(ts.getName());
ts.getInfo();

TestStream ts1 = TestStream.getTest();
ts1.setName("李四");
System.out.println(ts1.getName());
ts1.getInfo();

System.out.println(ts==ts1);//结果true,
//由结果可以得知单例模式为一个面向对象的应用程序提供了对象惟一的访问点,不管它实现何种功能,整个应用程序都会同享一个实例对象。
}

}


登记式单例:

package day0825singleton;

import java.util.HashMap;
import java.util.Map;
//登记式单例
//类似Spring里面的方法,将类名注册,下次从里面直接获取。
public class Singleton3{
private static Map<String,Singleton3> map = new HashMap<String,Singleton3>();

static{
Singleton3 single = new Singleton3();
map.put(single.getClass().getName(), single);
}

//保护的默认构造子
private Singleton3(){}

//静态工厂方法,返还此类惟一的实例
public static Singleton3 getInstance(String name){
if(name == null){
name = Singleton3.class.getName();
System.out.println("name为空则设定name为:"+name);
}
if(map.get(name)==null){
try {
map.put(name, (Singleton3)Class.forName(name).newInstance());
//forName:返回与带有给定字符串名的类或接口相关联的 Class 对象。
//.newInstance()创建类的无参对象
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}

return map.get(name);
}

//一个示意性的商业方法
public String about(){
return "Hi, i  am a Singleton";
}

public static void main(String[] args) {
Singleton3 single3 = Singleton3.getInstance(null);
System.out.println(single3.about());
}
}

/*运行结果:
name为空则设定name为:day0825singleton.Singleton3
Hi, i  am a Singleton
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: