浅谈JAVASE单例设计模式
简单的说设计模式,其实就是对问题行之有效的解决方式。其实它是一种思想。
1.单例设计模式。
解决的问题:就是可以保证一个类在内存中的对象唯一性。(单个实例)
使用单例设计模式需求:必须对于多个程序使用同一个配置信息对象时,就需要保证该对象的唯一性。
如何保证对象唯一性? 解决步骤:
1.不允许其他程序用new创建该对象。 1.私有化该类构造函数。
2.在该类创建一个本类实例。 2.通过new在该类中创建一个本类对象。
3.对外提供一个方法让其他程序可以获取该对象。 3.定义一个公有的方法,将创建的对象返回。
//饿汉式(开发时常用)
classSingle//类一加载,对象就已经存在了。
{
privatestaticSingles=newSingle();
privateSingle(){}
publicstaticSinglegetInstance()
{
returns;
}
}
//懒汉式(面试时常问,在多线程并发访问时候有可能导致不能保证不了对象的唯一性,存在安全隐患!)
classSingle2//类加载进来,没有对象,只有调用了getInstance方法时,才会创建对象。
//延迟加载形式。
{
privatestaticSingle2s=null;
privateSingle2(){}
publicstaticSingle2getInstance()
{
if(s==null)
s=newSingle2();
returns;
}
}
//调用类
classSingleDemo
{
publicstaticvoidmain(String[]args)
{
Singles1=Single.getInstance();
Singles2=Single.getInstance();
System.out.println(s1==s2);
//Singless=Single.s;//此处不采用这个是因为不可控,采用Single.getInstance();可以传参数进行相应调用。
}
}
饿汉式单例类在自己被加载时就将自己实例化。即便加载器是静态的,在饿汉式单例类被加载时仍会将自己实例化。单从资源利用效率角度来讲,这个比懒汉式单例类稍差些。从速度和反应时间角度来讲,则比懒汉式单例类稍好些。
3.登记式:
代码:
packagepattern.singleton;importjava.util.HashMap;importjava.util.Map;
//登记式单例类.
//类似Spring里面的方法,将类名注册,下次从里面直接获取。
publicclassSingleton3{
privatestaticMap<String,Singleton3>map=newHashMap<String,Singleton3>();
static{
Singleton3single=newSingleton3();
map.put(single.getClass().getName(),single);
}
//保护的默认构造子
protectedSingleton3(){}
//静态工厂方法,返还此类惟一的实例
publicstaticSingleton3getInstance(Stringname){
if(name==null){
name=Singleton3.class.getName();
System.out.println("name==null"+"--->name="+name);
}
if(map.get(name)==null){
try{
map.put(name,(Singleton3)Class.forName(name).newInstance());
}catch(InstantiationExceptione){
e.printStackTrace();
}catch(IllegalAccessExceptione){
e.printStackTrace();
}catch(ClassNotFoundExceptione){
e.printStackTrace();
}
}
returnmap.get(name);
}
//一个示意性的商业方法
publicStringabout(){
return"Hello,IamRegSingleton.";
}
publicstaticvoidmain(String[]args){
Singleton3single3=Singleton3.getInstance(null);
System.out.println(single3.about());
}
}