浅谈Android设计模式

本文主要探讨Android设计模式,包括设计模式的六大原则:单一职责、开放封闭、迪米特、接口隔离、依赖倒置和里氏替换原则。接着,重点介绍了几种设计模式:单例模式、建造者模式、享元模式、策略模式和观察者模式,阐述了它们的应用场景和作用,如单例模式确保唯一实例,建造者模式用于复杂对象创建,享元模式优化内存使用,策略模式封装算法,观察者模式实现对象间的动态依赖。
摘要由CSDN通过智能技术生成

       如果作为低年级入门的同学学习设计模式是比较困难的,建议先补充基础,积累经验再回过头进行学习设计模式,因为其中的重要性关乎到我们是否能够进阶成为相对优秀的Android工程师,高年级大佬麻烦多多指导。在阅读或者分析源码的时候,或多或少离不开设计模式,下面我只是挑了几个来谈谈我学习的理解。
       在分享设计模式之前,我们先了解下设计模式的六大原则:

1.单一职责原则:对于一个类而言,应该仅有一个引起它变化的原因。通俗地理解是不要在Activity中写Bean文件、网络请求处理和Adapter等。
2.开放封闭原则:类、模块、函数等应该是可以拓展,但是不可以修改。在开发中,需求是变化的,如果有新的需求,我们就要重新把类改一遍显然是很爆炸的,所有进来通过扩展的方式实现
3.迪米特原则:一个软件应当尽可能少地和其他实体发生相互作用。
4.接口隔离原则:一个类对另一个类的依赖应该建立在最小的接口上,接口的负责化要适度
5.依赖倒置原则:高层模块不应该依赖底层模块,两者都应该依赖于抽象。抽象不应该依赖细节,细节应该依赖与抽象。读起来很拗口,在Java中,抽象是指接口和抽象类;细节是实现类;高层模块就是调用者,底层模块就是具体的实现类,我的理解是类跟类之间的依赖通过抽象产生的。
6.里氏替换原则:所有引用基类的地方必须能透明地使用其子类的对象。

下面进入设计模式的话题,包括了:

创造型设计模式:单例模式、建造者模式(ps:简单工厂模式和抽象工厂模式理解的还不是很好,所以先不做分享)、结构型模式中的享元模式和行为型设计模式中的策略模式、观察者模式

一、单例模式:保证一个类仅有一个实例,并且提供一个可以访问的方法


/**
 * 6种单例模式写法
 * Created by XQM on 2018/5/13.
 */

//第一种,饿汉式.基于类加载机制,在类加载的时候就完成实例化,如果至始至终没有使用到该类会造成内存浪费
public class SingleDemo {
   
    private static SingleDemo instance = new SingleDemo();

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

//第二种,懒汉式,第一次加载时需要实例化,反应慢,在多线程并发不能保证单例
public class SingleDemo{
   
    private static SingleDemo instance;

    public static SingleDemo getInstance() {
        if (instance == null){
            instance = new SingleDemo();
        }
        return instance;
    }
}

//每次调用都需要同步,造成不必要的同步开销
public class SingleDemo{
   
    private static SingleDemo instance;

    public static synchronized SingleDemo getInstance() {
        if (instance == null){
            instance = new SingleDemo();
        }
        return instance;
    }
}

//双重检查模式DCL,在某些情况下会失效
public class SingleDemo{
   
    private static SingleDemo instance;

    public static SingleDemo getInstance() {
        if (instance == null){
            synchronized (SingleDemo.class){
                if (instance == null){
                    instance = new SingleDemo();
                }
            }
        }
        return instance;
    }
}

//静态内部类单例模式,第一次类加载的时候并不会初始化instance,
//当且仅当调用了getInstance()时JVM加载SingleDemoHolder初始化instance,
//所以保证了线程安全和单例,推荐使用
public class SingleDemo{
   

    public static SingleDemo getInstance() {
       return SingleDemoHolder.instance;
    }

    private static class SingleDemoHolder{
   
        private static final SingleDemo instance = new SingleDemo();
    }
}

/**
 * 枚举单例
 */
public enum  SingleDemo{
    INSTANCE;

    private void doSomThing(){

    }
}

补充下JVM对内部类的加载顺序

//静态内部类单例模式,推荐使用
public class SingleDemo{
    public static SingleDemo getInstance() {
       return SingleDemoHolder.instance;
    }

    //类静态属性
    public static SingleDemo testOut = new SingleDemo(
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值