上周五職級(jí)評(píng)審,被公司的T8問的暈頭轉(zhuǎn)向媒役,深感差距之大祝谚,自己還是應(yīng)該好好沉淀。by the way
設(shè)計(jì)模式很多酣衷,一百多種交惯,可平時(shí)我們開發(fā)應(yīng)用中卻只有那幾種,單例穿仪,建造席爽,工廠,裝飾牡借。拳昌。。
工廠模式在我們平時(shí)的開發(fā)中應(yīng)用也是非常廣泛钠龙,比如我們這期項(xiàng)目當(dāng)中就有具體用到炬藤,場(chǎng)景:我們?cè)赼ddView()時(shí)具體到View,會(huì)定義一個(gè)父類AbstractLayout,定義一些commmon method,子類具體的去實(shí)現(xiàn)碴里。
先看下工廠模式(Factroy Pattern)的具體定義
- 定義一個(gè)用于創(chuàng)建對(duì)象的接口沈矿,讓子類決定實(shí)例化那個(gè)類
使用場(chǎng)景
- 在任何需要生成復(fù)雜對(duì)象的地方,都可以使用工廠模式咬腋,復(fù)雜對(duì)象適合使用工廠模式羹膳,用new可以完成創(chuàng)建對(duì)象的對(duì)象無需使用工廠模式
抽象產(chǎn)品
public abstract class Product {
public abstract void method();
}
具體產(chǎn)品
public class ProductA extends Product {
@Override
public void method() {
}
}
抽象工廠
public abstract class Factory {
public abstract Product createProduct();
}
具體工廠
public class ConcreteFactory extends Factory {
@Override
public Product createProduct() {
return new ProductA();
}
}
主要分了四個(gè)模塊
- 抽象工廠:工廠方法模式的核心
- 具體工廠:自己具體實(shí)現(xiàn)業(yè)務(wù)邏輯
- 抽象產(chǎn)品:工廠模式所創(chuàng)建產(chǎn)品的父類
- 具體產(chǎn)品:抽象產(chǎn)品的某個(gè)具體產(chǎn)品的對(duì)象
具體的使用:
Factory factory = new ConcreteFactory();
Product product = factory.createProduct();
product.method();
這里生產(chǎn)的是ProductA,如果要生成ProductB,則用ProductB 繼承 Product 實(shí)現(xiàn)method方法 根竿,實(shí)現(xiàn)自己的業(yè)務(wù)邏輯陵像,在ContreteFactory的createProduct()方法內(nèi)返回則可
這種方法比較常見 需要那個(gè)就生成那個(gè)
當(dāng)然可以使用反射來更簡(jiǎn)潔的生成具體的對(duì)象
抽象工廠
public abstract class Factory {
// public abstract Product createProduct();
public abstract <T extends Product> T createProduct(Class<T> tClass);
}
具體工廠
public class ConcreteFactory extends Factory {
@Override
public <T extends Product> T createProduct(Class<T> tClass) {
Product product = null;
try {
product = (Product) Class.forName(tClass.getName()).newInstance();
}catch (Exception e){
e.printStackTrace();
}
return (T)product;
}
}
具體使用
Factory factory = new ConcreteFactory();
Product product = factory.createProduct(ProductA.class);
product.method;
需要那個(gè)類的對(duì)象就傳入那個(gè),這種方式更簡(jiǎn)潔寇壳,動(dòng)態(tài)醒颖,個(gè)人傾向于第二種。
這里使用到了范型方法壳炎,不太了解的可以看下
java中的范型方法
對(duì)應(yīng)到我們android中泞歉,onCreate()方法就相當(dāng)于一個(gè)工廠,不同的activity通過onCreate()方法設(shè)置contentVeiw返回給framework做處理,通過設(shè)置不同的view來展示不同的界面
關(guān)于onCreate()方法到底是怎么實(shí)現(xiàn)的有能力的可以親自讀源碼
這里簡(jiǎn)單的說下腰耙,在java中我們總會(huì)在構(gòu)造方法中去做一些初始化操作榛丢,可是對(duì)應(yīng)在android中activity貌似沒有這樣做,framework已經(jīng)替我們簡(jiǎn)化了這部分的邏輯挺庞,activity只需要根據(jù)相應(yīng)的生命周期去處理具體的業(yè)務(wù)邏輯晰赞。
我們都知道,對(duì)于一個(gè)app來說真正的入口是ActivityThread這個(gè)類挠阁,里面有我們熟悉的main方法宾肺,這個(gè)類被定義為final,不能被繼承,可以理解為一個(gè)程序?qū)?yīng)一個(gè)ActivityThread,一個(gè)入口侵俗,main方法里面有一些常規(guī)的邏輯锨用,比如準(zhǔn)備Looper和消息隊(duì)列,然后調(diào)用ActivityThread的attach()方法將它和AMS進(jìn)行了綁定隘谣,開始不斷的讀取消息隊(duì)列中的消息并發(fā)送消息增拥。
總體來說,工廠模式是一種比較好的設(shè)計(jì)模式寻歧,但是在我們新加一個(gè)新品類的時(shí)候需要編寫一個(gè)新的產(chǎn)品類掌栅,并引入抽象類,導(dǎo)致類結(jié)構(gòu)的復(fù)雜化码泛。所以根據(jù)實(shí)際的業(yè)務(wù)場(chǎng)景猾封,需要自己權(quán)衡。