前段时间空闲的时候,翻开《设计模式》看几页,加上在看之前就对要讲的单例模式有所了解。今天就在此好好的总结下我所理解的单例模式。
单例模式的特点如下:
1.一个类只能有一个实例;
2.这个类必须自己创建这个实例。
3.它必须给其他所有的对象提供这一实例。
在下面的情况下可以使用单例模式:
1.当类只能有一个实例而且用户可以从一个公用的访问点访问它时。
2. 需要频繁实例化然后销毁的对象。
3.创建对象时耗时过多或者耗资源过多,但又经常用到的对象。
4. 频繁访问数据库或文件的对象。
类图:
从上面类图可知在单例类中,有一个私有的构造方法SingIeton(),然后在里面公开了一个GetInstance()方法。单例模式保证一个类只有一个实例,同时这个类必须提供一个访问该类的全局访问点。
单例模式根据实例化对象时机的不同分为:一种是饿汉式单例,一种是懒汉式单例。饿汉式单例在单例类加载的时候,就实例化一个对象;而懒汉式单例在调用取得实例方法的时候才会实例化对象。代码如下:
1.饿汉式单例:
public class Singleton {
private static Singletonsingle=new Singleton(); //已经自行实例化
private Singleton() {
}
public static Singleton getInstance() {
return single;
}
}
2.懒汉式单例
public class Singleton {
private static Singleton single;
private Singleton() {
}
public static synchronized Singleton getInstance() { //在第一次调用的时候实例化
if(single==null) {
single=new Singleton();
}
return single;
}
}
单例模式的优点:
1.在内存中只有一个对象,节省内存空间。
2.避免频繁的创建销毁对象,可以提高性能。
3.避免对共享资源的多重占用。
4.可以全局访问。
单例模式注意事项:
1. 只能使用单例类提供的方法得到单例对象,不要使用反射,否则将会实例化一个新对象。
2.不要做断开单例类对象与类中静态引用的危险操作。
3.多线程使用单例使用共享资源时,注意线程安全问题(就是说在多线程的情况下,运行结果能和单线程的结果相同)。
4.饿汉式单例和懒汉式单例其中的构造方法都是私有的,所以其都是不可继承的,但并不是所有的单例模式都不可继承,如登记式单例。
最后附上测试的代码,以作参考。
1.Test.java
package single;
public class Test {
String name = null;
private Test() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private static Test ts = null;
public static Test getTest() {
if (ts == null) {
ts = new Test();
}
return ts;
}
public void printInfo() {
System.out.println("It's name is " + name);
}
}
2.懒汉式单例
package single;
public class TMain {
public static void main(String[] args) {
Test ts1 = Test.getTest();
ts1.setName("andy");
Test ts2 = Test.getTest();
ts2.setName("1111");
ts1.printInfo();
ts2.printInfo();
if (ts1 == ts2) {
System.out.println("它们是同一个实例");
} else {
System.out.println("它们不是同一个实例");
}
}
}
结论:由结果可以得知单例模式为一个面向对象的程序提供了对象唯一的访问点,整个程序共享一个实例对象。