《Android源碼設計模式解析與實戰》讀書筆記(五) 《Android源碼設計模式解析與實戰》PDF資料下載php
工廠方法模式,是建立型設計模式之一。數據庫
定義一個用於建立對象的接口,讓子類決定實例化哪一個類。設計模式
在任何須要生成複雜對象的地方,均可以使用工廠方法模式。複雜對象適合使用工廠模式,用new就能夠完成建立的對象無需使用工廠模式。bash
public abstract class AudiFactory {
public abstract <T extends AudiCar> T createAudiCar(Class<T> clz);
}
複製代碼
public class AudiCarFactory extends AudiFactory {
@Override
public <T extends AudiCar> T createAudiCar(Class<T> clz) {
AudiCar car = null;
try {
car = (AudiCar) Class.forName(clz.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return (T)car;
}
}
複製代碼
public abstract class AudiCar {
/**
* 汽車的抽象產品類
* <p>
* 定義汽車的一個行爲方法,車能夠啓動開走
*/
public abstract void drive();
/**
* 定義汽車的一個行爲方法,車能夠自動巡航
*/
public abstract void selfNavigation();
}
複製代碼
public class AudiQ3 extends AudiCar {
@Override
public void drive() {
System.out.println("Q3啓動了!");
}
@Override
public void selfNavigation() {
System.out.println("Q3開始自動巡航!");
}
}
複製代碼
public class AudiQ5 extends AudiCar {
@Override
public void drive() {
System.out.println("Q5啓動了!");
}
@Override
public void selfNavigation() {
System.out.println("Q5開始自動巡航!");
}
}
複製代碼
public class AudiQ7 extends AudiCar {
@Override
public void drive() {
System.out.println("Q7啓動了!");
}
@Override
public void selfNavigation() {
System.out.println("Q7開始自動巡航!");
}
}
複製代碼
//構造一個製造汽車的工廠對象
AudiFactory factory = new AudiCarFactory();
//生產Q3並啓動
AudiQ3 audiQ3 = factory.createAudiCar(AudiQ3.class);
audiQ3.drive();
audiQ3.selfNavigation();
//生產Q5並啓動
AudiQ5 audiQ5 = factory.createAudiCar(AudiQ5.class);
audiQ5.drive();
audiQ5.selfNavigation();
//生產Q7並啓動
AudiQ7 audiQ7 = factory.createAudiCar(AudiQ7.class);
audiQ7.drive();
audiQ7.selfNavigation();
複製代碼
輸出結果:微信
以數據存儲爲例,代碼以下所示:ide
public abstract class IOHandler {
/**
* 添加一條我的信息
* @param id
* @param name
*/
public abstract void add(String id, String name);
/**
* 刪除一條我的信息
* @param id
*/
public abstract void remove(String id);
/**
* 更新一條我的信息
* @param id
* @param name
*/
public abstract void update(String id, String name);
/**
* 查詢身份證對應的人名
* @param id
* @return
*/
public abstract String query(String id);
}
複製代碼
對每一種持久化方式都定義一個具體的IO處理類,分別爲普通文件存儲、xml文件存儲和SQLite數據庫存儲。ui
public class FileHandler extends IOHandler {
@Override
public void add(String id, String name) {
}
@Override
public void remove(String id) {
}
@Override
public void update(String id, String name) {
}
@Override
public String query(String id) {
return "AigeStudio";
}
}
複製代碼
public class XMLHandler extends IOHandler {
@Override
public void add(String id, String name) {
}
@Override
public void remove(String id) {
}
@Override
public void update(String id, String name) {
}
@Override
public String query(String id) {
return "SMBrother";
}
}
複製代碼
public class DBHandler extends IOHandler {
@Override
public void add(String id, String name) {
}
@Override
public void remove(String id) {
}
@Override
public void update(String id, String name) {
}
@Override
public String query(String id) {
return "Android";
}
}
複製代碼
定義一個工廠類,以下:spa
public class IOFactory {
public static <T extends IOHandler> T getIOHandler(Class<T> clz) {
IOHandler handler = null;
try {
handler = (IOHandler) Class.forName(clz.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return (T) handler;
}
}
複製代碼