单例设计模式

概念

       一种套路,用于解决某一些特点场景的思想。

      单例设计模式
      是一种最常见的设计模式,保证整个程序中只有一个实例。

应用场景

     都是一些特殊的类,例如:老板、管理类等(皮肤的管理、activity的管理)


套路

1.构造函数私有、防止在外部new对象。

2.内部必须提供一个静态方法,让外部调用。

案例:

A.

***单例---饿汉式:随着类的加载就已经存在了*****

Public class Singletask{

     

      //创建一个静态的实例对象。

      Private static SingleTask mInstance = new SingleTask();


      //构造函数私有化

      Private SingleTask(){

      }

     

      //创建一个方法,供外部调用。

      Public static SingleTask getInstance(){

            Return mInstance;

      }


}

B.

****单例---懒汉式:第一次用到的创建一个实例对象******

public class SingleTon{

      //创建一个静态的实例对象。

      Private static SingleTask mInstance;

      //构造函数私有化

      Private SingleTask(){

      }

     

      //创建一个方法,供外部调用。

      Public static SingleTask getInstance(){

      If(mInstace == null){

            //用到的时候才会创建一个静态的实例对象。


      Instance = new SingleTon();

}

            Return mInstance;

      }

}

懒汉存在的隐患:多线程的时候还是可能会存在多个实例。

解决方式:

  1. 加锁:
    Public static SingleTask synchronized getInstance()。同步锁:效率低。

    2.在别处加锁。线程安全,效率高

if(mInstace == null){

            一个静态的实例对象。

                  Synchronized(SingleTon,class){

                  if(mInstace == null){

Instance = new SingleTon();

      }

}

}
  1. volatile关键字。作用:1.防止重排序 2.线程可见性 (比较常用)

****单例模式、懒汉式(同步锁 DCL)*****

Private static volatile SingleTon mInstance;

    Instace == null){

            一个静态的实例对象。

                  Synchronized(SingleTon,class){

                  if(mInstace == null){

Instance = new SingleTon();

      }

}

}

SingleTask s  = new SingleTask();

  1. 开辟一块内存空间。
  2. 初始化对象。
  3. 给变量复值

但是JAVA 2、3的顺序是不定的。因此加入Volatile。
线程的可见性:某一个线程改了公用对象(变量),短时间内另外一个线程是不可见的,因为每一个线程都有自己的缓存区(线程是不见的)

****单例设计模式 静态内部类(比较常用)****

Public class SingleTask01{

       Private SinleTask01(){}

      

       Public static SingleTask getInstance(){

             Return SingleTaskHolder.mInstance;

}     


       Public class SingleTaskHolder{

                  Private static volatile SingleTask mInstance = new SingleTask01();

}



}

****单例设计模式 容器管理、系统的服务用的就这种*****

Public class SingleTask02{

       Private SinleTask02(){}

       Private static Map<String,object> mSingleMap = new HashMap<>();

       Static{

      

       mSingleMap.put(“key”,”Value”);


}

       Public static Object  getservice(String serviceName){

             Return msingleMap.get(serviceName)

}


}

最大的案例:activity管理。

注册登录功能:

  1. 在注册界面点击提交的操做之后:

提交数据 保存用户数据 关闭当前的注册界面。

  1. 如果只挂壁注册页面那就会回到登录页面,我们一般在注册后默认就登录成功,那么也需要实现关闭登录页面,怎么实现?

方法:a.eventbus(纯反射) b.广播(有延迟 ) c.集合管理 d.SingleTask(适用于部分)

      集合管理方法实现:

//唯一实例
private static volatile ActivityManager mInstance;

//创建一个保存activity集合,增删改比较多
private Stack<Activity> mActivities;



private ActivityManager() {
    mActivities = new Stack<>();
}


public static ActivityManager getInstance(){
    if(mInstance == null){
        //保证线程安全
        synchronized (ActivityManager.class){
            if(mInstance == null){
                mInstance = new ActivityManager();
            }
        }
    }

    return mInstance;

}


/**
 *添加统一管理
 * @param activity
 */

public void attach(Activity activity){
    mActivities.add(activity);

}

/**
 *移除解绑
 * @param detachActivity
 */
public void detach(Activity detachActivity){
    //for循环有没有问题
    for(Activity activity:mActivities){
        if(detachActivity == activity){
            mActivities.remove(detachActivity);
        }
    }
}

public void finish(Activity finishActivity){
    //for循环有没有问题
    for(Activity activity:mActivities){
        if(finishActivity == activity){
            mActivities.remove(finishActivity);
            activity.finish();
        }
    }
}

/**
 * 根据actity的类名关闭activity
 * @param finishActivity
 */
public void finish(Class<? extends Activity> finishActivity){
    //for循环有没有问题
    for(Activity activity:mActivities){
        if(finishActivity.getCanonicalName().equals(finishActivity.getClass().getCanonicalName())){
            mActivities.remove(finishActivity);
            activity.finish();
        }
    }
}


//得到当前的activity
public Activity currentActivity(){
    return mActivities.lastElement();
}

package com.example.makemode;



import androidx.appcompat.app.AppCompatActivity;



import android.content.Intent;

import android.os.Bundle;

import android.util.Log;

import android.view.View;



import com.example.makemode.activitymanager.ActivityManager;



public class LoginActivity extends AppCompatActivity {



    private String TAG ="登录界面的activity:";



    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_login);

        ActivityManager.getInstance().attach(this);

        Log.d(TAG,"onCreate:");

        setTitle("登录");

    }



    @Override

    protected void onResume() {

        super.onResume();

        Log.d(TAG,"onResume:");

    }



    @Override

    protected void onDestroy() {

        super.onDestroy();

        ActivityManager.getInstance().detach(this);

        Log.d(TAG,"onDestroy:");

    }



    public void click(View view){



        Intent intent  = new Intent(LoginActivity.this,RegisterActivity.class);

        startActivity(intent);





    }



}

package com.example.makemode;



import androidx.appcompat.app.AppCompatActivity;



import android.content.Intent;

import android.os.Bundle;

import android.util.Log;

import android.view.View;



import com.example.makemode.activitymanager.ActivityManager;



public class MainActivity extends AppCompatActivity {



    private String TAG = "activity的生命周期:";



    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        Log.d(TAG,"onCreate:");

        ActivityManager.getInstance().attach(this);

        setTitle("登录");

    }



    @Override

    protected void onResume() {

        super.onResume();

        Log.d(TAG,"onResume:");

    }



    @Override

    protected void onDestroy() {

        super.onDestroy();

        ActivityManager.getInstance().detach(this);

        Log.d(TAG,"onDestroy:");

    }





    public void click(View view){



        Intent intent  = new Intent(MainActivity.this,LoginActivity.class);

        startActivity(intent);





    }







}
package com.example.makemode;



import androidx.appcompat.app.AppCompatActivity;



import android.content.Intent;

import android.os.Bundle;

import android.util.Log;

import android.view.View;



import com.example.makemode.activitymanager.ActivityManager;



public class RegisterActivity extends AppCompatActivity {



    private String TAG = "注册界面的activity的生命周期:";



    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_register);



        setTitle("注册");

    }

    @Override

    protected void onResume() {

        super.onResume();

        Log.d(TAG,"onResume:");

    }



    @Override

    protected void onDestroy() {

        super.onDestroy();

        Log.d(TAG,"onDestroy:");

    }





    public void click(View view){

        //点击之后,不光要关闭自己,还要关闭登录界面。

        ActivityManager.getInstance().finish(this);

        ActivityManager.getInstance().finish(LoginActivity.class);

    }



}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Abednego_子瑜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值