概念
一种套路,用于解决某一些特点场景的思想。
单例设计模式
是一种最常见的设计模式,保证整个程序中只有一个实例。
应用场景
都是一些特殊的类,例如:老板、管理类等(皮肤的管理、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;
}
}
懒汉存在的隐患:多线程的时候还是可能会存在多个实例。
解决方式:
- 加锁:
Public static SingleTask synchronized getInstance()。同步锁:效率低。
2.在别处加锁。线程安全,效率高
if(mInstace == null){
一个静态的实例对象。
Synchronized(SingleTon,class){
if(mInstace == null){
Instance = new SingleTon();
}
}
}
- volatile关键字。作用:1.防止重排序 2.线程可见性 (比较常用)
****单例模式、懒汉式(同步锁 DCL)*****
Private static volatile SingleTon mInstance;
Instace == null){
一个静态的实例对象。
Synchronized(SingleTon,class){
if(mInstace == null){
Instance = new SingleTon();
}
}
}
SingleTask s = new SingleTask();
- 开辟一块内存空间。
- 初始化对象。
- 给变量复值
但是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管理。
注册登录功能:
- 在注册界面点击提交的操做之后:
提交数据 保存用户数据 关闭当前的注册界面。
- 如果只挂壁注册页面那就会回到登录页面,我们一般在注册后默认就登录成功,那么也需要实现关闭登录页面,怎么实现?
方法: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);
}
}