Android设计模式之单例模式详解
作者:Allure丶 发布时间:2022-03-12 16:51:47
标签:Android,设计模式,单例模式
单例模式
一个类只有一个实例,并且可以全局访问使用
应用场景
如账户管理类,数据库操作类等(某个对象频繁被访问使用)
常用方式
饿汉式
懒汉式
同步加锁
DCL双重加锁验证
静态内部类
枚举单例
饿汉式
加载类的同时立即进行初始化操作,对资源消耗很大
public class SingleTest {
public static final SingleTest singleTest1=new SingleTest();
public SingleTest() {
}
public static SingleTest getSingleTest1(){
return singleTest1;
}
}
懒汉式
优点:需要使用时候才进行初始化加载
缺点:线程不安全,在多线程中很容易出现不同步的情况
public class SingleTest1 {
private static SingleTest1 instance=null;
public SingleTest1() {
}
public static SingleTest1 getInstance(){
if(instance==null){
instance=new SingleTest1();
}
return instance;
}
}
同步加锁
优点:解决线程安全问题
缺点:每次实例需要判断加锁状态,效率低下
public class SingleTest2 {
private static SingleTest2 instance=null;
public SingleTest2() {
}
public static synchronized SingleTest2 getInstance(){
if(instance==null){
instance=new SingleTest2();
}
return instance;
}
}
DCL双重校验
优点:并发不高的情况下可以完美运行(推荐使用,客户端几乎不存在高并 * 况)
缺点:JDK1.5以前可能会出现instance为初始化的问题(现在的Android几乎都是1.7 1.8了几乎可以略率此问题)
public class SingleTest4 {
private static SingleTest4 instance=null;//静态变量
public SingleTest4() {
}
public static SingleTest4 getInstance(){
if (instance == null) {//第一层校验
synchronized (SingleTest4.class) {
if (instance == null) {//第二层校验
instance = new SingleTest4();
}
}
}
return instance;
}
}
静态内部类
优点:延迟加载,线程安全,内存消耗少(推荐使用)
public class SingleTest5 {
private SingleTest5() {
}
public static final SingleTest5 getInstance() {
return SingletonHolder.INSTANCE;
}
//定义的静态内部类
private static class SingletonHolder {
private static final SingleTest5 INSTANCE = new SingleTest5(); //创建实例的地方
}
}
枚举单例
优点:线程安全,防反序列化,防反射,写法简单
public enum SingleTest6 {
//第一种方式
// INSTANCE;
// private CaiPiao instance;
//
// SingleTest6() {
// instance = new CaiPiao();
// }
//
// public CaiPiao getInstance() {
// return instance;
// }
//
// class CaiPiao {
//
// }
//第二种方式
INSTANCE2{
@Override
protected void CaiPiao() {
System.out.println("彩票");
}
};
protected abstract void CaiPiao();
}
github代码地址
来源:http://blog.csdn.net/asddavid/article/details/77198481


猜你喜欢
- 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。比如说,你的代码少了一个分号,那么运行出来结果是提示是错误
- 其实很简单,就是把我们的数据库文件放到我们的手机里,所以不必局限在哪个地方写这个代码,在第一次创建数据库的时候可以,我觉得在软件起动页里效果
- 本文章向大家讲解java中时间的获取和格式化, 一. 获取当前系统时间和日期并格式化输出:import java.util.Dat
- 设计模式要进行共性与可变性的分析,对共性进行抽象,同时对可变性进行封装,没有完美的设计模式,作为一名开发者要懂得取舍,触类旁通,开发出高内聚
- 如何调试Java程序?大家最开始学习Java,都会觉得IDE调试好高端有木有,其实很简单了。下文会尽量简单直观的教会你在Eclipse中调试
- 俄罗斯方块Tetris是一款很经典的益智游戏,之前就做了一款桌面版的java俄罗斯方块,这次就尝试着写了一款适用于Android平台的俄罗斯
- 前言:Android自定义View对于刚入门乃至工作几年的程序员来说都是非常恐惧的,但也是Android进阶学习的必经之路,平时
- 本文实例为大家分享了C++ socket实现miniFTP的方法,供大家参考,具体内容如下客户端:服务端:建立连接 &
- 1 运算符1.1 概述运算符 用于连接 表达式 的 操作数,并对操作数执行运算。例如,表达式num1+num2,其操作数是num1和num2
- 一.搭建1.前端npm installnpm run serve2.后端老生常谈的配置,修改mysql与redis即可。二.业务功能介绍功能
- /// 删除文件和目录public class Cleaner { /// /// 删除指
- Mybatis-plus官网地址:https://baomidou.com/配置mysql在配置文件连接mysqlspring.dataso
- 前言这几天看《Java并发编程之美》的时候又遇到了ThradLocal这个类,不得不说,这个类在平时很多场景都遇得到,所以对其进行一个系统性
- C#中的很多关键词用法比较容易混淆,var和dynamic就是其中一组,他们都可以申明动态类型的变量,但是本质上他们还是有不少区别的。var
- 本文实例为大家分享了java实现时间与字符串之间转换的具体代码,供大家参考,具体内容如下1. long字符串转换成yyyy-MM-dd HH
- Java——获取字符串编码格式判断一个字符串的编码格式: public static St
- 前言偶然逛国外博客,看到了一个介绍文字动画的库,进入 pub 一看,立马就爱上这个动画库了,几乎你能想到的文字动画效果它都有!现在正式给大家
- PROPAGATION_REQUIRED: 如果存在一个事务,则支持当前事务。如果没有事务则开启事务;PROPAGATION_REQUIRE
- IComparable<T>.NET 里,IComparable<T>是用来作比较的最常用接口。如果某个类型的实例需
- 当使用struts2的validation.xml进行验证时,需要注意如下几个方面:I.首先应该注意validation.xml的名字,一定