之前在面试的时候被问过单例模式的设计,没回答上,于是查阅了一些介绍单例模式的博客,下面简单的总结下。
单例模式适用的场景:假如你创建了一个类,同时你希望这个类只有一个实例,不会被外部类new多次,这个时候你就可以考虑使用单例模式了。
单例模式的三个特点:
1.单例类只能有一个实例。
2.单例类必须自己创建这个实例。
3单例类必须给其他对象提供这个实例。
下面我主要介绍两种经典的单例设计模式:
一.懒汉模式
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 //懒汉模式 2 public static Singleton{ 3 //创建单例模式内的唯一实例 4 private static singeton single= null; 5 //注意这里构造方法的修饰符变成了private 6 private Sigleton(){ 7 } 8 //静态工厂方法 9 private static Singleton getInstance(){ 10 if(single == null){ 11 single = new Singleton(); 12 } 13 return single; 14 }
这种懒汉模式在第一次调用的时候创建了实例对象,但是存在着线程不安全的缺点。不过可以通过使用同步synchronized关键字来完善新能具体写法如下:
将上面的静态工厂方法改成:
public static syschronized Singleton getInstance(){ }
二.饿汉模式
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 //饿汉模式 2 public static Singleton{ 3 4 //私有的构造方法 5 private Singleton(){ 6 } 7 8 //这里直接创建唯一实例,注意加了final关键字 9 private static final Singleton single = new Singleon(); 10 11 //静态工厂方法 12 public static Singleton getInstance(){ 13 return single; 14 } 15 }
通过对比我们也能很容易看出饿汉模式的优缺点:
优点:直接创建对象,线程安全。
缺点:如果创建单例对象比较大,创建后又迟迟不能使用,则消耗资源。
有些事或者有些东西或许从来没有见过,我们在第一次接触的时候可能会感觉到不适。走出舒适区,去学习和克服困难,然后获取成就感,并且培养解决问题的能力,这就是我学习的主要动力。
文章的作者算是个小白,如果有什么地方说的不对,请不吝赐教。