Java设计模式之单例设计模式

409 阅读1分钟
原文链接: blog.csdn.net

1.单例设计模式

  • 懒汉式与饿汉式有什么不同?
    懒汉式的特点在于实例的延迟加载。
  • 懒汉式延迟加载有没有问题?
    有,如果多线程访问时会出现安全问题。
  • 如何解决?
    可以加同步来解决,但是稍微有些低效(同步代码块和同步函数都行),可以通过双重判断来解决低效问题,提高效率。

2.代码实现

(1)饿汉式

package com.zhoujian.singgleinstance.single;

/**
 * Created by zhoujian on 2016/12/5.
 */

/**
 * 饿汉式
 */
public class SingleOne
{
    //私有构造函数,防止被实例化
    private SingleOne(){}
    //创建对象
    private static final SingleOne mSingleOne = new SingleOne();
    //获取对象
    public static SingleOne getInstance()
    {
        return mSingleOne;
    }
}

(2)懒汉式

package com.zhoujian.singgleinstance.single;

/**
 * Created by zhoujian on 2016/12/5.
 */


/**
 * 懒汉式
 */
public class SingleTwo
{

    //私有构造函数,防止被实例化
    private SingleTwo()
    {

    }

    private static SingleTwo mSingleTwo = null;

    public static SingleTwo getSingleInstance()
    {
        if (mSingleTwo == null)
        {
            synchronized (SingleTwo.class)
            {
                if(mSingleTwo == null)
                {
                    mSingleTwo =new SingleTwo();
                }
            }
        }

        return mSingleTwo;
    }
}

3.测试代码

package com.zhoujian.singgleinstance.activity;

import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;
import com.zhoujian.singgleinstance.R;
import com.zhoujian.singgleinstance.single.SingleTwo;

public class MainActivity extends Activity
{

    private SingleTwo mInstanceone;
    private SingleTwo mInstanceteo;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mInstanceone = SingleTwo.getSingleInstance();

        mInstanceteo =  SingleTwo.getSingleInstance();

        if (mInstanceone==mInstanceteo)
        {
            Toast.makeText(this, "两个对象是同一个对象", Toast.LENGTH_SHORT).show();
        }
    }
}

4.源码下载地址

源码下载地址:https://github.com/zeke123/SingleInstance