单例模式的目的:
单例模式的目的和其他的设计模式的目的都是一样的,都是为了降低对象之间的耦合性,增加代码的可复用性,可维护性和可扩展性。
单例模式:
单例模式是一种常用的设计模式,用简单的言语说,单例模式就是一个类只包含一个实例对象,且该类能够自行创建该实例对象的一种设计模式。
单例模式的特点:
1.一个类里只有一个单例对象
2.类能够自行创建单例对象
3.能够保证内存里只有一份对象
4.单例模式设计一个全局的访问点
单例模式主要有两种模式:
1.饿汉模式
饿汉模式单例是指类在加载时就创建了一个单例对象,不管用没用到,先创建了再说,这就是饿汉模式。
简单单例模式实现:
java
public class Singleton {
//单例模式:饿汉模式
private Singleton(){
}
private static Singleton singleton=new Singleton();//设为static,类在加载时就已经实例化
public static Singleton getInstance(){
return singleton;
}
}
饿汉模式缺点:
由于饿汉模式是在类加载时就创建了实例对象,不管是否用到,这样的话虽然保证了在调用getInstance()方法之前一定已经存在单例对象,但是这样容易造成空间资源的浪费。
2.懒汉模式
懒汉模式单例是指先不创建实例对象,等需要用到时再创建实例对象。
懒汉模式简单实现:
java
public class Singleton2 {
//单例模式:懒汉模式
private Singleton2(){
}
private static Singleton2 singleton2; //类加载时还没实例化
public static Singleton2 getInstance(){
if(singleton2 == null){
singleton2=new Singleton2();
}
return singleton2;
}
}
懒汉模式缺点:
懒汉模式是线程不安全的,在多线程的情况下,每个线程的运行结果都是不一样的
java
public class Singleton2 {
//单例模式:懒汉模式
private Singleton2(){
System.out.println(Thread.currentThread().getName()+"");
}
private static Singleton2 singleton2; //类加载时还没实例化
public static Singleton2 getInstance(){
if(singleton2 == null){
singleton2=new Singleton2();
}
return singleton2;
}
public static void main(String[] args) {
for(int i=0;i<5;i++){
//lambda表达式创建匿名类对象
new Thread(()->{
Singleton2.getInstance();
}).start();
}
}
}