单例模式(Singleton)
一种创建性模型,它用来确保只产生一个实例,并提供一个访问它的全局访问点.对一些类来说,保证只有一个实例是很重要的,比如有的时候,数据库连接或 Socket 连接要受到一定的限制,必须保持同一时间只能有一个连接的存在.
单例模式的类型:
一、饿汉模式
创建一个类,将其构造方法私有化,外界无法创建此类的对象,实例化一个对象,外界可以通过这个类的对象进行访问,当将这个实例化的对象变成私有对象时,此前使用的方法失效,这时可以为外界提供一个获取实例化对象的方法,使用public static进行修饰,外界可以通过这个方法访问这个类中的对象。
public class Singleton1 {
//构造方法私有化
private Singleton1(){
}
//创建类的唯一实例,使用private static修饰
private static Singleton1 instance = new Singleton1();
//提供一个获取实例的方法,使用public static修饰
public static Singleton1 getInstance(){
return instance;
}
}
public class test {
public static void main(String[] args){
//饿汉模式
Singleton1 s1 = Singleton1.getInstance();
Singleton1 s2 = Singleton1.getInstance();
if(s1==s2){
System.out.println(true);
}else {
System.out.println(false);
}
}
}
二、饿汉模式
创建一个类,将其构造方法私有化,外界无法创建此类的对象,声明类的唯一实例,使用private static修饰,提供一个获取实例的方法getinstance,使用public static修饰.
public class Singleton2 {
//构造方法私有化
private Singleton2() {
}
//声明类的唯一实例,使用private static修饰
private static Singleton2 instance;
//提供一个获取实例的方法,使用public static修饰
public static Singleton2 getinstance() {
if (instance == null) {
instance = new Singleton2();
}
return instance;
}
}
public class test {
public static void main(String[] args){
//懒汉模式
Singleton2 s3 = Singleton2.getinstance();
Singleton2 s4 = Singleton2.getinstance();
if(s3==s4){
System.out.println(true);
}else {
System.out.println(false);
}
}
}
两种模式的测试结果都是true,那么这两种模式有什么相同点和区别呢?
首先两种方案的构造函数和公用方法都是静态的(static),实例和公用方法又都是私有的(private)。
区别在于以下几点:
1、饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不在改变。懒汉式如果在创建类的同时未创建对象,线程是不安全的。
2、从实现方式来讲他们最大的区别就是懒汉式是延时加载,它是在需要的时候才创建对象,而饿汉式在虚拟机启动的时候就会创建,饿汉式无需关注多线程问题、写法简单明了、能用则用。但是它是加载类时创建实例。
网友评论