ddong1031 / MdyBlog

安卓、java知识总结分享
8 stars 0 forks source link

常见设计模式 #8

Open ddong1031 opened 6 years ago

ddong1031 commented 6 years ago

单例设计模式

java中的单例设计模式主要有两种: 懒汉式和恶汉式(都是私有构造方法,只对外提供对象,不创建新的对象) 恶汉式:无论怎么样我先吃到再说,这种方式利用空间换区时间,通常在一开始的时候就加载

private static final A instance =new A();
private A(){}
public static A getInstance(){
return instance;
}

在类创建的时候就产生一个对象,直接开辟一块内存,为以后对象的调用做准备。 懒汉式

private  static final A instance;
private A(){}
public  static A getInstance(){
if(instance ==null){
instance =new A();
}
return instance;
}

懒汉式的加载,也称为懒加载,在你的对象没调用之前是没有开辟内存空间的,当你调用的时候才会进行new对象操作。这种写法在单线程是可用的,在多线程容易造成并发。 在懒汉式改进后可以这样写,这其中加入了synchronized,也称之为doublecheck

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

在单例中除了 synchronized关键字之外,还有一个关键字volatile,要想深入理解我们就应该知道什么是原子操作。 例如A = new A()这句,这并非是一个原子操作,事实上在 JVM 中这句话大概做了下面 3 件事情。 1,给 A 分配内存 2,调用 A 的构造函数来初始化成员变量,形成实例 3,将A对象指向分配的内存空间(执行完这步 A才是非 null 了) 还有就是i=1;跟i++;的区别。 i=1直接赋值就是原子操作,而i++则是先拿到当前i的值然后对其进行+1。 好了现在说volatile,我们可以在instance的修饰中加入volatile。 同样volatile也不具备原子性,但是如果是原子性操作,例如成员变量的标志位 boolean b =true,则可以用到volatile来修饰,被写入 volatile 变量的这些有效值独立于任何程序的状态,包括变量的当前状态。   1)对变量的写操作不依赖于当前值   2)该变量没有包含在具有其他变量的不变式中   事实上,我的理解就是上面的2个条件需要保证操作是原子性操作,才能保证使用volatile关键字的程序在并发时能够正确执行。   常用在

volatile boolean flag = false;
while(!flag){
    doSomething();
}
public void setFlag() {
    flag = true;
}

或者在doublecheck加入volatile 还有一种常用的,最稳定的单例设计模式,采用enum的模式,应为enum只实例化一次,所以可以这样写

public enumA{ instance;

}

ddong1031 commented 6 years ago

MVC,MVP,MVVM框架

MVP现在基本成熟,经常用,但是mvvm目前还是有很多不同,暂时参考一下其他文章 张鸿洋:浅谈 MVP in Android 阮一峰: MVC,MVP 和 MVVM 的图示 Jensen: Android中的MVC和MVP(分析+实例) CSDN: 认清Android框架 MVC,MVP和MVVM 恰同学上年:Android中MVVM模式 简书:MVVM + data-binding 快速入门 美团技术点评团队:如何构建Android MVVM 应用框架 Android面试一天一题:Android开发的套路MVP & MVVM