在企业应用开发当中为了解决多次创建重复对象而造成空间的极度浪费这时候Java设计模式--单例模式起到了举足轻重的作用,下面由我带领大家认识Java中常见的设计模式---单例模式附带小案例
最简单的单例模式
package com.tarena.prictve;
public class MySingleton {
private static MySingleton mySingleton;
public MySingleton() {
}
public static MySingleton getmySingleton(){
if(mySingleton==null){
mySingleton=new MySingleton();
}
return mySingleton;
}
}
该设计案例有个不好的地方在多线程的环境中会创建多个单例对象,而且会出现许多问题
这时我们可以使用线程同步锁synchronized来实现确保线程安全 见代码
package com.tarena.prictve;
public class MySingleton {
private static MySingleton mySingleton;
public MySingleton() {
}
public static synchronized MySingleton getmySingleton(){
if(mySingleton==null){
mySingleton=new MySingleton();
}
return mySingleton;
}
}
2.类加载时创建单例模式这样就不需要同步了在类加载后就创建了对象
package com.tarena.prictve;
public class MySingleton {
private final static MySingleton mySingleton=new MySingleton();
public MySingleton() {
}
public static MySingleton getmySingleton(){
return mySingleton;
}
}
3.采用延时加载的方式来加载(静态方法在构造方法之前执行)
package com.tarena.prictve;
public class MySingleton {
private static MySingleton mySingleton=null;
static{
mySingleton=new MySingleton();
}
private MySingleton() {
}
public static MySingleton getmySingleton(){
return mySingleton;
}
}
4.双层检测锁实现方式 但是还是不理想当开发者通过反射修改修饰符为public就又会出创建单例
package com.tarena.prictve;
public class MySingleton {
private volatile MySingleton mySingleton=null;
private MySingleton() {
}
public MySingleton getmySingleton(){
if(mySingleton==null){
synchronized(MySingleton.class){
if(mySingleton==null){
mySingleton=new MySingleton();
}
}
}
return mySingleton;
}
}
5.通过枚举来实现(流行)
package com.tarena.prictve;
public enum MySingleton {
INSTANCE;
public void doSomeInstring(){
}
}
//测试
MySingleton mse=new MySingleton();
mse.INSTANCE;//获得实例
//获得引用你就可以调用它的任何方法
mse.doSomeInstring();
//说明:枚举的好处,枚举本身就是单例的可以,不必担心对象同步的问题,避免了初始化等问题