Android开发中常见的设计模式深入浅出——单例模式singleton

已经转做Android半个月了 设计模式还不怎么了解 从今天起就从最简单的单例模式开始吧!

###说得不对的还请各位来battle (粗体是重点,对象实例 是一个意思)

单例模式singleton

顾名思义单例模式就是只有一个实例

如:需要班长统计学生信息的时候(需求) 不用每次找班长的时候都进行选拔(进行实例化) 在整个大学期间(程序运行期间)只选拔一次(实例化一次)就够了

确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

优点

显而易见,在移动端开发过程中 有一些实例化起来比较消耗内存的类 索性我们就不回收了 减少gc 保持程序在运行时始终有一个该类的对象在内存中 这种方式可以大大提高性能
当对象需要被共享的场合。由于单例模式只允许创建一个对象,共享该对象可以节省内存

实现方式

1.必须防止外部可以调用构造函数进行实例化,私有化构造方法(不对外开放)

2.对外只提供一个获取本类实例的静态方法(一个全局访问点)

3.确保一个类只有一个实例对象

单例模式是设计模式中最简单的模式之一。通常,普通类的构造函数是公有的,外部类可以通过“new 构造函数()”来生成多个实例。但是,如果将类的构造函数设为私有的,外部类就无法调用该构造函数,也就无法生成多个实例。这时该类自身必须定义一个静态私有实例,并向外提供一个静态的公有函数用于创建或获取该静态私有实例。

结构图UML

主要角色
1.可以自行实例化的单例类SingLeton
2.调用它的访问类Client
Android开发中常见的设计模式深入浅出——单例模式singleton_第1张图片

实现

通常有两种实现方式
1.饿汉式(先填饱肚子再说)

/**
 * @program: TestSinglet
 * @description: 饿汉式
 * @author: tkx
 * @create: 2021-01-16 14:11
 **/
public class Singleton {
     
    private static final Singleton instance = new Singleton();

    private Singleton() {
     

    }

    public static Singleton getInstance() {
     
        return instance;
    }
}

在类创建时同时创建好一个静态对象来提供使用 所以是线程安全的
2.懒汉式(你啥时候喊我,我啥时候动弹)

/**
 * @program: TestSinglet
 * @description: 懒汉式
 * @author: tkx
 * @create: 2021-01-16 14:21
 **/
public class Singleton {
     
    //保证 instance 在所有线程中同步
    private static volatile Singleton instance = null;

    private Singleton() {
     
    }    //private 避免类在外部被实例化

    public static synchronized Singleton getInstance() {
     
        //getInstance 方法前加同步
        if (instance == null) {
     
            instance = new Singleton();
        }
        return instance;
    }
}

如果编写的是多线程程序,则不要删除上例代码中的关键字 volatile 和 synchronized,否则将存在线程非安全的问题。如果不删除这两个关键字就能保证线程安全,但是每次访问时都要同步,会影响性能,且消耗更多的资源,这是懒汉式单例的缺点。

volatile:

被volatile关键字修饰的变量,编译器与运行时都会注意到这个变量是共享的,因此不会将该变量上的操作与其他内存操作一起重排序。volatile变量不会被缓存在寄存器或者对其他处理器不可见的地方,因此在读取volatile类型的变量时总会返回最新写入的值。

其他实现方式

  • 双重检查锁模式(在需要创建对象的时候再进行同步锁操作 (懒汉中的懒汉))
  • 枚举模式(枚举实例在任何情况都是一个单例且是线程安全的)
  • 静态内部类实现的单例(单例模式推荐的实现方式 详情请查阅:JVM类加载机制(类加载过程和类加载器))

最后 我们应用一下单例模式。管理我们的Activity,下面这个可以作为一个工具类

/**
 * @program: TestSinglet
 * @description: manager
 * @author: tkx
 * @create: 2021-01-16 14:30
 **/
public class ActivityManager {
     

	private static volatile ActivityManager instance;
	private Stack<Activity> mActivityStack = new Stack<Activity>();
	
	private ActivityManager(){
     
		
	}
	
	public static ActivityManager getInstance(){
     
		if (instance == null) {
     
		synchronized (ActivityManager.class) {
     
			if (instance == null) {
     
				instance = new ActivityManager();
			}
		}
		return instance;
	}
	
	public void addActicity(Activity act){
     
		mActivityStack.push(act);
	}
	
	public void removeActivity(Activity act){
     
		mActivityStack.remove(act);
	}
	
	public void killMyProcess(){
     
		int nCount = mActivityStack.size();
		for (int i = nCount - 1; i >= 0; i--) {
     
        	Activity activity = mActivityStack.get(i);
        	activity.finish();
        }
		
		mActivityStack.clear();
		android.os.Process.killProcess(android.os.Process.myPid());
	}
}

你可能感兴趣的:(java,设计模式,android,多线程,编程语言)