1. 單例模式
public class SingletonTest{
private SingletonTest(){}
private static volatile SingletonTest instance;
public static SingletonTest getInstance() {
if (instance == null) { //不爲null時直接返回對象,效率高
synchronized (SingletonTest.class) { //同步代碼塊,保證不會重複創建
if (instance == null) {
instance = new SingletonTest();
}
}
}
return instance;
}
}
Android中應用:獲得系統級服務時,如LayoutInflater、WindowManagerService、ActivityManagerService等。
2. 工廠模式
(1)簡單工廠模式:創建一個用於創建對象的工具類
(2)工廠方法模式:
對簡單工廠進行抽象。一個抽象產品類,可派生出多個具體產品類;一個抽象工廠類,可派生出多個具體工廠類,每個具體工廠類只能創建一個具體產品類實例。
public interface IFactory {
IProduct getProduct();
}
public class AFactory implements IFactory {
public Iproduct getProduct() {
return new AProduct(AProduct.class.getName());
}
}
public class BFactory implements IFactory {
public Iproduct getProduct() {
return new BProduct(Bproduct.class.getName());
}
}
(3)抽象工廠模式
可將一些有聯繫或相近的產品,放入一個工廠去生產。
多個抽象產品類,可派生多個具體產品;一個抽象工廠,可派生多個具體工廠類,每個工廠類可創建多個產品實例。
//抽象工廠
public interface AbstractFactory {
public Engine createEngine();
public AirCondition createAircondition();
}
//具體工廠A
public class FactoryBMW implements AbstractFactory {
public Engine createEngine() {
return new EngineA();
}
public Aircondition createAircondition() {
return new AirconditionA();
}
}
//具體工廠B
public class FactoryBenz implements AbstractFactory {
public Engine createEngine() {
return new EngineB();
}
public Aircondition createAircondition() {
return new AirconditionB();
}
3. 觀察者模式
- Subject:抽象主題(被觀察者),將所有觀察者對象保存在一個集合中,每個主題可有任意數量的觀察者,抽象主題提供一個接口,可增加和刪除觀察者對象
- ConcreteSubject:具體主題(被觀察者),將有關狀態存入具體觀察者對象,在具體主題內部狀態發生改變時,給所有註冊過的觀察者發送通知
- Observer:抽象觀察者,定義了一個接口,使在得到主題更改通知時更新自己
- ConcreteObserver:具體觀察者,實現抽象觀察者定義的更新接口,以便在得到主題更改通知時更新自身
//抽象主題
public interface Subject {
public void attach(Observer observer);
public void detach(Observer observer);
public void notify(String message);
}
//具體主題
public class Subjection implements Subject {
private List<Observer> userList = new ArrayList<Observer>();
public void attach(Observer observer) {
userList.add(observer);
}
public void detach(Observer observer) {
userList.remove(observer);
}
public void notify(String message) {
for (Observer observer : userList) {
observer.update(message);
}
}
}
//抽象觀察者
public interface Observer {
public void update(Stirng message);
}
//具體觀察者
public class User implements Observer {
private String name;
public User(String name) {
this.name = name;
}
public void update(String message) {
System.out.println(name + "-" + message);
}
優點:解耦,使各自的變換不會影響另一邊
缺點:開發效率和運行效率
安卓中應用:OnClickListener、ContentObserver、android.database.Observable、Adapter的notifyDataSetChanged()
、組件通訊庫RxJava、RxAndroid、EventBus
4. 迭代器模式
提供一種方法訪問一個容器對象的各個元素,而又不暴露該對象的內部細節。
- 抽象迭代器:定義遍歷元素所需的方法
next()
、hasNext()
、remove()
- 具體迭代器:實現迭代器接口中的方法,完成集合的迭代
- 抽象容器:一般爲一個接口,提供
iterator()
方法,如java中的collection、List、Set接口等 - 具體容器:抽象容器的具體實現類,如List的有序列表實現ArrayList,鏈表實現LinkedListed,Set接口的哈希列表實現HashSet等
優點:簡化了遍歷方式,可提供多種遍歷方式,封裝性良好
缺點:對較簡單的遍歷(如數組或有序列表),使用迭代器較繁瑣