单例设计模式(Singleton)

来源:互联网 发布:西南交通大学网络缴费 编辑:程序博客网 时间:2024/06/09 15:23

一、设计模式:解决某一类问题最行之有效的方法

二、单例设计模式:一个类只能有一个实例(不同类中重复使用一个对象,可采用单例设计模式)

三、保证对象唯一

  1. 为了避免其他程序过多建立该类对象,先禁止其他程序建立该类对象——构造方法私有化(private)。
  2. 为了其他程序可以访问到该类对象,在本类中创建一个私有静态的本类对象(private static),设置为static是因为是类的自身属性;若不写static,则该对象就是该类对象的属性,只能通过对象访问,而我们不允许在外部创建该类的对象。
  3. 为了方便其他程序对该对象进行访问,提供一个静态的获取实例的方法将实例返回(public static)

四、实现步骤

//饿汉式:先初始化对象,Single类一进内存,就已经创建好了对象。(开发使用这个)class Single{    private int num;        public int getNum() {        return num;    }    public void setNum(int num) {        this.num = num;    }    //单例    private Single() {}    private static Single s = new Single();    public static Single getInstance() {        return s;    }}class Text {        public static void main(String[] args) {         //获得该实例,s1==s2          Single s1 = Single.getInstance();        Single s2 = Single.getInstance();        s1.setNum(30);        System.out.println(s2.getNum());    }}//运行结果:30(s1,s2指向的是同一个对象)//使用:当需要将该事物的对象保证在内存中唯一,就使用上述方法即可,其他该怎么描述,就怎么描述。

五、单例设计模式另一种写法

//懒汉式:方法被调用时,才初始化对象,也叫做对象的延时加载class Single{    private static Single s = null;    private Single() {}    public static Single getInstance() {        if (s == null) {            s = new Single();        }               return s;    }}//问题://若多个线程调用getInstance(),可能1个线程判断是否为空后挂住,再执行第二个线程//判断后生成一个对象,然后又去执行第一个线程,又生成一个对象//这样可以生成n个对象,就不是想要的单例设计模式了,这就产生了安全隐患。//解决方法1:对该方法上锁(synchronized),每次只能进来一个对象,当线程较多时,每个线程都需要判断这个锁比较低效,可能造成锁等待,性能问题。public static synchronized Single getInstance() {        if(s == null) {            s = new Single();        }           return s;}   //解决方法2:锁放在里面,双检查public static Single getInstance() {        if(s == null) { //第一次调用            synchronized(Single.class) {//静态方法,锁是 类名.class,因为静态没有this                if(s == null) //判断在锁定期间是否被其他线程初始化了                    s = new Single();            }        }        return s;}   //多个线程运行时,A线程判断后,进入锁执行完s不再为空,B进入第一个判断条件就不符合,就不需要继续判断了,提高了一定的效率。
0 0
原创粉丝点击