首页 > 代码库 > 三、singleton(单例化)一个对象的几种方法

三、singleton(单例化)一个对象的几种方法

方案一:私有化构造器,通过static final域

@Test    public void test13() {        A215 a=A215.a;        A215 b=A215.a;        System.out.println(a==b);//true    }class A215{    public static final A215 a=new A215();    private A215(){}}

 

方案二:私有化构造器,私有化static final域通过工厂模式来实现

@Test    public void test20() {        A211 a1=A211.getA211();        A211 a2=A211.getA211();        System.out.println(a1==a2);//true    }class A211{    private static final A211 a=new A211();    public static A211 getA211(){        return a;    }}

 

方案三,通过Enum来实现

@Test    public void test12() {        A216 a217 = A216.A217;        A216 a218 = A216.A217;        System.out.println(a217==a218);//true    }}enum A216{    A217;    private A217 a=null;    private A216(){        a=new A217();        a.name="wangyang";    }    public A217 getA217(){        return a;    }    }class A217{    public String name;    public void hello(){        System.out.println("hello "+name);    }}

其实对于第一种,和第二种方法。通过反射或者序列化可以打破其单例的实现,但第三种无偿地提供了序列化机制,绝对防止多次实例化,即使是在面对复杂的序列化或者反射攻击的时候

三、singleton(单例化)一个对象的几种方法