---------------------- android培训、java培训、期待与您交流!
单例设计模式,在我们团队一个月以前的一个交流短会上,一个学长刚好介绍了一下这个东西,但是当时就是听得云里雾里的,不明白他在讲啥,然后看毕老师的视频,刚好就讲了它,挺巧的。
所谓单例模式,就是自己写的一个类,处于安全等方面的原因,不希望使用者再去建立对象,在整个程序中就只能有一个对象。
实现思路:首先,将构造函数私有化,让使用者不能new它,然后,在类的本身建立一个对象,然后通过一个public方法给出,这样使用者在使用的时候就只能使用这个方法来调用那个唯一对象。除此之外,其他方法跟普通的类一样。这样也不会影响其他方法的使用。
从对象的初始化时间来看,有两种模式,即:饿汉式和懒汉式
1.饿汉式:既然饿,就想快点吃,所以在开始的时候就给出对象,此模式线程安全。
代码:
class Person{
private String name;
private int age;
private Person(){};
Person p=new Person();
public Person getInstance(){
return p;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
这样,在使用此类的时候,就不能用Person p=new Person()来建立对象了(因为构造函数已经私有化)。想要使用此类,就只能使用 Person p=Person.getinstance();来实现。
2.懒汉式:既然懒,在声明p的时候,就不想去建立对象,在使用的时候才会建立对象。
代码:
class Person{
private String name;
private int age;
private Person(){};
Person p;
public Person getInstance(){
if(p==null) p=new Person();
return p;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
这个模式(也叫单例模式的延迟加载对象),在被调用instance对象,这样节约资源,但是也存在一个问题,就是如果是多线程操作此类,某一线程在刚好进入getinstance()方法的时候失去了CPU的控制权,然后另一个线程也刚好执行此操作,就可能造成建立两个对象。所以 必须加上线程锁:
改后代码:
class Person{
private String name;
private int age;
private Person(){};
Person p;
public synchronized Person getInstance(){
if(p==null) p=new Person();
return p;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
这样就保证了在线程进入getInstance()方法后就必须执行完才交出CUP控制权,从而解除了线程安全的问题。
-------------------------------------------- android培训、java培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net/heima