面試知識點總結之設計模式

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等

優點:簡化了遍歷方式,可提供多種遍歷方式,封裝性良好
缺點:對較簡單的遍歷(如數組或有序列表),使用迭代器較繁瑣

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章