首先我们对单例模式进行一个简单的了解
什么是单例模式
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。
注意事项
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
单例模式的优缺点
1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例。
2、避免对资源的多重占用。
饿汉式
实现步骤;
构造器私有化
类的内部构建对象
向外部暴露一个静态的公共方法
代码演示:
public class SingleTon01 {
public static void main(String[] args) {
//通过方法可以获取对象
GirlFriend instance = GirlFriend.getInstance();
System.out.println(instance); //小红红
//此时如果在创建新的对象,值任不会改变
GirlFriend instance2 = GirlFriend.getInstance();
System.out.println(instance2); //小红红
System.out.println(instance == instance2);//true
}
}
class GirlFriend {
private String name;
//2. 类的内部构建对象
//为了能够在静态方法中返回gf对象,需要用static修饰
private static GirlFriend gf = new GirlFriend("小红红");
//1. 构造器私有化
private GirlFriend(String name) {
this.name = name;
}
//3. 向外部暴露一个静态的公共方法
public static GirlFriend getInstance() {
return gf;
}
@Override
public String toString() {
return name;
}
}
饿汉式存在的问题:饿汉式中虽然只能有一个对象,但是该对象为事先就创建好的,也就是该对象一直存在,那么就可能出现创建了对象,但没有使用而造成浪费;
懒汉式
实现步骤;
构造器私有化
类的内部构建对象
向外部暴露一个静态的公共方法
public class SingleTon02 {
public static void main(String[] args) {
Cat instance = Cat.getInstance();
System.out.println(instance); //草莓
//再次调用getInstance()
Cat instance1 = Cat.getInstance();
System.out.println(instance); //草莓
System.out.println(instance == instance1); //true
}
}
class Cat{
private String name;
//定义一个static静态属性对象
private static Cat cat;
//1. 任然让构造器私有化
private Cat(String name) {
this.name = name;
}
@Override
public String toString() {
return name;
}
//提供一个public的static方法,可以返回对象
public static Cat getInstance() {
//如果没有创建对象
if (cat == null) {
cat = new Cat("草莓");
}
return cat;
}
}
懒汉式:只有当用户使用getInstance时,才返回cat对象,后面再次调用getInstance时,返回上次创建好的cat对象。
饿汉式与懒汉式的区别
两者最主要的区别在于创建对象的时机不同:饿汉式是在类开始加载时就创建了对象实例,而懒汉式在使用时才会创建;
饿汉式有浪费资源的可能,因为如果我们一个对象实例都没有用,那么饿汉式创建的对象就被浪费掉了,懒汉式是使用时才会创建对象,所以就不会存在这样的问题;