Android比较常用的设计模式

单例模式

饿汉式:线程安全

class Singleton {
   //1,私有构造函数
   private Singleton(){}  //这里不需要分号
   //2,创建本类对象
   private static Singleton s = new Singleton();
   //3,对外提供公共的访问方法
   public static Singleton getInstance() {
      return s;
       }
 }

懒汉式:线程不安全,需要加锁

class LazyCode {
     //私有构造函数
     private LazyCode(){}
     //声明一个本类的引用
     private static LazyCode code = null;
     //加锁,获得单例
     public static synchronized LazyCode  getInstance(){
         if (code == null){
             code = new LazyCode();
         }
         return code;
     }

}

Builder模式

定义:将一个复杂对象的构造与它的表示分离,使得同样的构造过程可以创建不同的表示。

AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setIcon(R.drawable.icon)
  .setTitle("title")
  .setMessage("message")
  .setPositiveButton("OK", null)
  // create之前的set方法操作的都是AlertDialog.Builder而已
  .create()
  // create之后就创建出一个真实的AlertDialog了,将复杂的创建过程都隐藏在create方法内部
  .show();

工厂方法模式

定义:定义一个创建对象的接口,让子类决定实例化哪个类

public abstract class Product{
    public abstract void method();
} 
public  abstract class Factory{
    public abstract Product createProduct();
}

public class ConcreteProductA extends Prodect{
    public void method(){
        System.out.println("我是产品A!");
    }
}
public class ConcreteProductB extends Prodect{
    public void method(){
        System.out.println("我是产品B!");
    }
}
// 类的实例化被推迟到了子类
public class MyFactory extends Factory{
    public Product createProduct(){
        return new ConcreteProductA();
    }
}

Android下的例子有BitmapFactory

public class BitmapFactory {
    public static Bitmap decodeFile(String pathName, Options opts) {
        Bitmap bm = null;
        ......
        return bm;
    }
}

观察者模式

定义:定义了对象之间的一对多的关系,其实就是1:n,当“1”发生变化时,“n”全部得到通知,并更新。

观察者模式比较典型的场景就是发布消息通知订阅者。没错Android下的广播就是观察者模式,在FrameWork层,状态发生变化后(比如WIFI状态),会遍历全部的register。

 

迭代器模式

定义:提供一种方法顺序访问一个容器对象中的各个元素,而不需要暴露该对象的内部表示。

这个迭代器再好理解不过了,我们天天用的Iterator正是这种迭代器模式。

在Android中SQLiteDatabase的query也是迭代器模式

cursor = database.query(...);
while(cursor.moveToNext()){
    cursor.get...;
}

装饰模式

定义:动态的给一个对象添加额外的功能。就增加功能来说,装饰模式比子类集成的方式更灵活。

public class ContextWrapper extends Context {
    Context mBase;
    // 由构造函数传入一个content
    public ContextWrapper(Context base) {
        mBase = base;
    }
}

参考链接:https://www.jianshu.com/p/906701e988d1

你可能感兴趣的:(android日常开发)