一、单例模式的主要特点:
1、只能有一个实例。
2、在单例类中创建自己的实例。
3、创建的实例通过一个公有的方法去让其它类去使用。
二、实现上面三个的方式是:
1、将构造方法私有化。
2、在类中创建一个本类对象。
3、提供一个方法可以获取该对象。
三、单例模式分为两种:1、饿汉式。2、懒汉式。
四、具体的实现方法如下代码:
1、饿汉式:这种也是开发中常用的。它不涉及线程安全问题
package cn;
public class Persion {
private String name;
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
private Persion(){//提供一个私有的构造方法
}
private static Persion p = new Persion();//创建一个私有的对象
public static Persion getInstance(){//提供一个外部访问的对象的方法
return p;
}
}
调用代码:
package cn;
public class Demo1 {
public static void main(String[] args) {
Persion p = Persion.getInstance();
Persion p1 = Persion.getInstance();
System.out.println(p==p1);
}
}
执行结果:
true
2、懒汉式:这种在开发中不常用,因为它涉及线程不安全的情况,但是可以用过线程同步解决,如果这样比较繁琐,还不如用饿汉式比较方便。
package cn;
public class Persion {
private String name;
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
private Persion(){//提供一个私有的构造方法
}
private static Persion p = null;//创建一个私有的对象的引用
public static Persion getInstance(){//提供一个外部访问的对象的方法
if(p==null){
p = new Persion();//判断是否为空,如果为空就创建对象,就在这里有线程安全问题,如果多两个人同时访问的情况下,会有创建多个对象的情况
}
return p;
}
}
调用上面的代码和结果和饿汉式的一样。
结果懒汉式的方式如下:
package cn;
public class Persion {
private String name;
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
private Persion(){//提供一个私有的构造方法
}
private static Persion p = null;//创建一个私有的对象的引用
//public static synchronized Persion getInstance(){//如果使用这种,这种的相率很低,不宜使用。
public static Persion getInstance(){//提供一个外部访问的对象的方法
if(p==null){
synchronized(Persion.class){
if(p==null){//使用双重判断
p = new Persion();//判断是否为空,如果为空就创建对象,就在这里有线程安全问题,如果多两个人同时访问的情况下,会有创建多个对象的情况
}
}
}
return p;
}
}