单例模式是一种比较基础的设计模式,应该非常广泛,如应用程序的日志应用,Web应用的配置文件读取,数据库连接池的设计,网站的计数器,并且Spring MVC 框架的Controller默认也是单例的
那么到底什么是单例模式?单例模式的优点又有哪些?
单例模式的关键就是在系统运行期间,某个类有且只有一个实例,这种设计模式的最大优点在于可以对资源进行重复利用,节约重复创建和销毁的成本,从而降低服务器压力,提高程序的运行效率。
1、懒汉模式
懒汉模式就是指铁匠是个懒汉,这个锤子类的实例在没人用的时候,铁匠不去造它,这样做能节约铁匠铺的空间。
/**
* 单例模式-懒汉模式
* 1.构造器私有化
* 2.提供一个static静态属性对象
* 3.提供一个public的static方法,返回一个实例对象
* 4.懒汉模式,只有在用户调用方法时,才会创建对象,之后再次调用,返回的是同一对象
*/
class Cat {
private String name;
private static Cat cat;
private Cat(String name) {
this.name = name;
}
public static Cat getCat() {
if (cat == null) {
cat = new Cat("加菲猫");
}
return cat;
}
@Override
public String toString() {
return "Cat{" +
"name='" + name + '\'' +
'}';
}
}
2、饿汉模式
这个模式可以较简单地解决同时有客人光顾的问题。即铁匠是个饿汉,总是担心生意上门了却没锤子可提供,因此铁匠铺开张的时候(类定义时)就把锤子造好等人来用
/**
* 单例模式-饿汉模式
* 在类加载的时候就会创建对象
*/
class GirlFriend {
public String name;
private static GirlFriend gf = new GirlFriend("小红");
public static GirlFriend getGf() {
return gf;
}
/**
* 构造器私有化,不能在本类之外new
* @param name
*/
private GirlFriend(String name) {
this.name = name;
}
@Override
public String toString() {
return "GirlFriend{" +
"name='" + name + '\'' +
'}';
}
}
可以看出,和懒汉模式唯一的区别就在于是否先生产好锤子。这种方式会使得空间占用变多,如果没人使用就白白浪费了。
懒汉和饿汉的区别:
饿汉的特点是加载类比较慢(由于加载类的时候需要加载累的对象,比较慢),但是获取对象的速度比较快,线程安全;
懒汉的特点是加载类比较快,但是获取对象的速度比较慢,线程不安全;