Android设计模式相关⾯试题
单例
单例介绍
单例的概念
单例模式是⼀种对象创建模式,它⽤于产⽣⼀个对象的具体实例,它可以确保系统中⼀个类只产⽣⼀个实例。
单例的好处
1. 对于频繁使⽤的对象,可以省略创建对象所花费的时间,这对于那些重量级对象⽽⾔,是⾮常可观的⼀笔系统开销。
2. 由于new操作的次数减少,因⽽对系统内存的使⽤频率也会降低,这将减轻GC压⼒,缩短GC停顿时间。
单例的六种写法和各⾃的特点
1. 饿汉
1. code
public class HungrySingleton {
private static final HungrySingleton sHungrySingleton = new HungrySingleton();
public HungrySingleton() {
}
public static HungrySingleton getHungrySingleton() {
return sHungrySingleton;
}
}
2. 不⾜之处
⽆法对instance实例做延时加载
2. 懒汉
1. code
public class LazySingleton {
private static LazySingleton instance;
public LazySingleton() {
}
public static LazySingleton getInstance(){
//第⼀次调⽤的时候会初始化
if (instance==null){
instance=new LazySingleton();
}
return instance;
}
}
2. 不⾜之处
在多线程并发下这样的实现是⽆法保证实例的唯⼀的
3. 懒汉线程安全
1. code
public class LazySafetySingleton {
private static LazySafetySingleton instance;
public LazySafetySingleton() {
}
//⽅法中声明synchronized关键字
public static synchronized LazySafetySingleton getInstance() {
if (instance == null) {
instance = new LazySafetySingleton();
}
return instance;
}
//同步代码块实现
public static LazySafetySingleton getInstance() {
synchronized (LazySafetySingleton.class) {
if (instance == null) {
instance = new LazySafetySingleton();
}
}
return instance;
}
}
2. 不⾜之处 性能
4. DCL(双重检查锁机制)
1. code
public class DclSingleton {
private static volatile DclSingleton mInstance = null;
// private static DclSingleton mInstance = null;
private DclSingleton() {
}
public static DclSingleton getInstance() {
//避免不必要的同步
if (mInstance == null) {
//同步
synchronized (DclSingleton.class) {
if (mInstance == null) {
mInstance = new DclSingleton();
}
}
}
return mInstance;
}
}
2. 不⾜之处
JVM的即时编译器中存在指令重排序的优化
5. 静态内部类
1. code
public class StaticInnerSingleton {
private StaticInnerSingleton() {
private StaticInnerSingleton() {
}
public StaticInnerSingleton getInstance() {
return SingletonHolder.sInstance;
}
/**
* 类级的内部类,也就是静态类的成员式内部类,该内部类的实例与外部类的实例
* 没有绑定关系,⽽且只有被调⽤时才会装载,从⽽实现了延迟加载
*/
private static class SingletonHolder {
/
**
* 静态初始化器,由JVM来保证线程安全
*/
private static final StaticInnerSingleton sInstance = new StaticInnerSingleton();
}
}
2. 优点 JVM本⾝机制保证了线程安全 没有性能缺陷
3. 原因 static/final
6. 枚举
1. code
public enum EnumSingleton {
/
/定义⼀个枚举的元素,它就是Singleton的⼀个实例
INSTANCE;
}
2. 优点 写法简单 线程安全
总结
1. 饿汉:⽆法对instance实例进⾏延迟加载
2. 懒汉:多线程并发情况下⽆法保证实例的唯⼀性
3. 懒汉线程安全:使⽤synchronized导致性能缺陷
4. DCL:JVM即时编译器的指令重排序
5. 静态内部类/枚举:延迟加载/线程安全/性能优势
Android 中的单例
1. Application
public class MyApplication extends Application {
public static MyApplication instance;
@Override
public void onCreate() {
//设置 Logger.init(TAG).logLevel(LogLevel.NONE) 可以设置为不打印⽇志
instance = this;
}
public static MyApplication getInstance() {
return instance;
}
}
2. 单例模式引起的内存泄露
3. EventBus的坑
Builder模式
Java 的 Builder 模式
1. 概念alertdialog使用方法
建造者模式是较为复杂的创建型模式,它将客户端与包含多个组成部分(或部件)的复杂对象的创建过程分离
2. 使⽤场景
Glide Okhttp
当构建⼀个对象需要很多参数的时候,并且参数的个数或者类型不固定的时候
3. UML结构图分析
4. 实际代码分析
public class Product {
private String partA;//定义部件,部件可以是任意类型,包括值类型和引⽤类型
private String partB;
private String partC;
public String getPartA() {
return partA;
}
public void setPartA(String partA) {
this.partA = partA;
}
public String getPartB() {
return partB;
}
public void setPartB(String partB) {
this.partB = partB;
}
public String getPartC() {
return partC;
return partC;
}
public void setPartC(String partC) {
this.partC = partC;
}
}
abstract class Builder {
//创建产品对象
protected Product mProduct = new Product();
public abstract void buildPartA();
public abstract void buildPartB();
public abstract void buildPartC();
/
/ 返回产品对象
public Product getResult() {
return mProduct;
}
}
public class ConcreteBuilder extends Builder {
@Override
public void buildPartA() {
}
@Override
public void buildPartB() {
}
@Override
public void buildPartC() {
}
}
public class Director {
private Builder mBuilder;
public Director(Builder builder) {
mBuilder = builder;
}
public void setBuilder(Builder builder) {
this.mBuilder = builder;
}
//产品构建与组装⽅法
public Product construct() {
mBuilder.buildPartA();
mBuilder.buildPartB();
mBuilder.buildPartC();
Result();
}
}
5. Builder模式的优点
1. 松散耦合:⽣产器模式可以⽤同⼀个构建算法构建出表现不同的产品,实现产品构建和产品表现上的分离
2. 可以很容易的改变产品的内部表⽰
3. 更好的复⽤性:⽣产器模式很好的实现构建算法和具体产品实现的分离
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论