---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
单例模式是用于解决一个类在内存中只存在一个对象。
那么想要保证对象唯一:
1, 为了避免其他程序过多建立该类对象,先要禁止其他程序建立该类对象。
2, 为了让其他程序可以访问到该类对象,可以在本类中自定义一个本类对象。
3, 为了方便其他程序对自定义本类对象访问,可以对外提供一些访问方式。
这三步怎么用代码实现的?
1, 禁止创建该类对象,可以将构造方法私有化。
2, 在该类中创建一个本类对象。
3, 提供一个方法可以获取到该类对象。
而单例模式的实现方式有三种(就我目前了解的):饿汉式,懒汉式
饿汉式:先创建对象。HungrySingle类一加载进内存,就创建好了对象hs。
git@code.csdn.net:snippets/254583.git
懒汉式:采用了延时加载。HungrySingle类一加载进内存,对象hs还没有存在,只有调用了getInstance方法时,才建立对象。
class HungrySingle{
privatestatic HungrySingle hs = null;
//创建一个null的本类对象
privateHungrySingle(){
//构造方法私有化,不让其他程序创建对象
}
public HungrySingle getInstance(){
//延时加载,用到的时候再创建出来就可以了。
if(hs== null)
hs= new HungrySingle();
returnhs;
}
}
但是,在多线程运行环境下,延时加载就不安全了。所以一般会用到synchronized关键字或者同步代码块,如:
public HungrySingle getInstance(){
if(s== null){
synchronized(Single.class){
if(s==null){
s= new Single();
}
}
}
returns;
}
上面程序可以看到,有双重判断,有同步。这样的程序效率极低。
所以建议使用饿汉式。
后来学到了枚举。还可以用枚举的方式实现单例。
张老师视频里有句话:枚举只有一个成员时,就可以作为一种单例的实现方式。
首先,枚举的构造方法必须私有化,这个跟单例的一样,其次枚举就是返回的本类对象。
用枚举的方式先创建对象,而且只有一个,那么调用的时候就只有一个了.例如:
public enum Person{
ZHANGSAN("张三",20);
private Stringname;
private int age;
public String getName() {
returnname;
}
public int getAge() {
returnage;
}
private Person(String name,int age){
this.name = name;
this.age = age;
}
}
---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------