您的位置:首页 > 其它

设计模式——单例模式

2020-12-08 20:31 113 查看 https://www.cnblogs.com/pgrigh

单例模式:一个类只能有一个实例(只能创建出一个对象),为了节省内存资源

怎么保证只有一个实例?

我们知道,当创建一个新对象时,我们会调用类的构造方法,创建多个对象,那我们就会调用多次构造方法,现在我们要保证只有一个实例,也就是说我们不管创建多少个对象,都只调用一次构造方法,那么怎么实现呢?我们可以给构造方法加上private修饰符,这样构造方法就只能被本类访问了,其他地方你要创建类对象,要访问构造方法就会被拒绝,但是这样的话在其他类要创建对象时就不能使用当前类对象了,所以为了解决这个问题,可以对外提供一个公共方法返回一个对象。

总结一下就是:

  1. 构造方法私有化

  2. 对外提供一个公共方法返回一个对象

代码实现:

/**
* @author PgRightWu
* @version 1.0
* @date 2020/12/8 16:42
* @description  单例模式
*/
/*
* 单例模式步骤
* 1.构造方法私有化
* 2.对外提供公共方法返回一个对象
* */
public class Singleton {
//    1.构造私有化
private Singleton(){}
//    饿汉式(一开始就创建)
private static Singleton s = new Singleton();
//    2.对外提供私有方法保证返回一个对象(因为外部调用类的方法要实例化对象,所以用static修饰,可以通过类名调用)
public static Singleton getSingleton(){
return s;
}

}
class TestSingleton{
public static void main(String[] args) {
Singleton s1 = Singleton.getSingleton();
Singleton s2 = Singleton.getSingleton();
Singleton s3 = Singleton.getSingleton();
System.out.println(s1);
System.out.println(s2);
System.out.println(s3);

}
}

这样的话,不管创建多少个Singleton对象,都是指向同一个内存地址,也就是只有一个实例

运行效果:

采用懒汉式实现单例模式,其实也很简单,懒汉式就是什么时候用就什么时候创建对象

实现代码:

public class Singleton {
//    1.构造私有化
private Singleton(){}
//    懒汉式(什么时候用什么时候创建)
private static Singleton s;
//    2.对外提供私有方法保证返回一个对象(因为外部调用类的方法要实例化对象,所以用static修饰,可以通过类名调用)
public static Singleton getSingleton(){
if(s==null)
s = new Singleton();
return s;
}

}

现在我们来聊一聊单例模式饿汉式与懒汉式的区别

  • 饿汉式是在类加载时就进行实例化,而懒汉式默认不会实例化,是什么时候new什么时候才实例化
  • 饿汉式是线程安全的,因为在类加载时对象就已经实例化了,而懒汉式不是线程安全的,是什么时候用就什么时候实例化,这样当多个线程同时需要实例化某个对象时,访问实例化代码,就会生成多个对象,所以是线程不安全的(可以通过同步锁解决)。
  • 饿汉式是在类加载时实例化对象,所以会占用内存空间,造成内存空间的浪费,而懒汉式是什么时候用什么时候实例化对象,相对不会造成内存浪费。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: