饿汉式:线程安全
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;
}
}
定义:将一个复杂对象的构造与它的表示分离,使得同样的构造过程可以创建不同的表示。
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