详细讲解单例模式是什么?为什么要用?怎么用?

学习设计模式入门的第一课,一般都是单例模式。基本每个程序员都会使用单例模式,这种模式也是最简单的一种设计模式。本文会以安卓进行讲解,在文末附上Object-C和JavaScript的单例模式实现方法。讲解不当之处欢迎指点

什么是单例模式呢?其实说起来很简单。有的类在使用的时候不管在什么地方都需要能取到,它的一些属性需要在不同共享,又不便于多次创建,这样的情况,我们就应该使用单例模式。

假设我们有一个工具类Util,里面封装了把作者的名字写上去的方法WriteMyName。每次调用就输出作者的名字,在编写FristActivitiy这个类的时候我需要用到这个工具类,于是我果断调用了以下语句

 Util util = new Util();
 unil.writeMyName();

这样就创建了一个util对象。
然后在使用SecondAcitivty这个类的时候,我又用util把我的名字也写上去了。
于是我又写下Util util = new Util();
这时候我又创建了一个util对象。
当我写到100个类的时候,就会创建一百个对象。如果这个对象很大的话,无疑会造成内存浪费。这是单例模式解决的第一个问题,资源开销。
假如这个类里面存着我的名字,我有天改名了,那么我只能要么修改Unit这个类,要么在子类中一一修改

单例设计模式理解起来很简单,就是一个类只有一个实例,不管你再哪个函数中创建,在哪个函数中使用,始终只有这一个实例化对象,说简单点,就是
Util util = new Util();
这个语句只会使用一次,以后我们在任何地方再使用,都是用这个被new出来的util。如何做到呢?就是让util以外的任何函数都无法使用这个实例化方法,只有util自己能使用,然后再把这个对象传出去给外面的人使用。相信看到这里,谁都可以自己写出一个单例设计模式
public class Util(){
private Util(){}——让构造函数私有化
private static final Util util=new Util();
public static Util getutil()
{return util;}
}
这就是没有任何需求的最简单的单例设计模式,仅仅需要将它的构造函数私有化,再写一个能将自己的实例化对象传到外部的函数,就完成了。可是仔细一想。这个单例设计模式的缺陷是非常大的,它没有任何判断,到底这个类存在吗?正在被创建吗?在线程中使用安全吗?这些问题都没有考虑,仅仅是把它创建出来。但是这种方法其实也可以应付各种简单应用场景了。
假如考虑在线程中使用,就不得不把代码优化,这里贴上我同事写的例子作为示范
`package
import android.media.MediaPlayer;

/**

  • Created by YI on 2017/7/31.
    */

public class MediaPlayerInstance {
private static MediaPlayerInstance instance = null;
private MediaPlayer mediaPlayer = null;
private MediaPlayerInstance(){
mediaPlayer = new MediaPlayer();
}
public static MediaPlayerInstance getInstance(){
if (instance == null){
synchronized (MediaPlayerInstance.class){
if(instance == null){
instance = new MediaPlayerInstance();
}
}
}
return instance;
}
}
`
这个代码看起来很烦,因为很多循环套在一起,它被叫做双锁模式,就是第一次先判断这个实例有没有,有的话我们就不用创建了,第二次判断它是不是正在被创建,如果是我们也不用创建了。这种方法大概率可以保证我们创建的单例对象是唯一的

再说一种java构造内部类实现的单例模式

public class Util(){
private Util(){}

public static util() getUtil(){
return get.util 
}
private static class get{
private static final Util util = new util();
}
}

每个内部类都没有名字,所以外部无法调用,而且每个内部类完成工作后都会被销毁,这也是java里面最好的创建单例模式的方法
今天就写到这里吧

你可能感兴趣的:(设计模式,设计模式,单例设计模式)