封裝類中變化的部分,提取其中個性化善變的部分爲獨立類,通過依賴注入以達到解耦、複用和方便後期維護拓展的目的
ok,還是舉個🌰,
既然是工廠模式,就打比方有一個工廠生產產品,首先要一個抽象產品類,描述產品的公共方法,以及兩個具體的產品(手機產品和電視產品):
/**
* 抽象產品類,所有產品的抽象父類,描述公共的方法部分
*/
public abstract class Product {
public abstract void dosomething();
}
/**
* 具體產品類,所有產品的抽象父類,描述公共的方法部分
* 這裏比如想生產 手機產品,電視產品
*/
public class PhoneProduct extends Product {
@Override
public void dosomething() {
//具體事情實現,比如這裏生產cpu,屏幕,攝像頭等製作手機
}
}
public class TvProduct extends Product {
@Override
public void dosomething() {
//具體事情實現,比如這裏生產電視屏幕,遙控器等
}
}
再把工廠的製造產品方法抽象出來,實現具體工廠類
/**
* 抽象工廠類,生產一個泛型的產品對象
*/
public abstract class Factory {
public abstract Product createProduct(Class<? extends Product> c);
}
/**
* 具體工廠類,所有產品從這裏生產,可以返回具體的產品對象
*/
public class RealFactory extends Factory {
public Product createProduct(Class<? extends Product> c) {
Product product = null;
try {
product = (Product) Class.forName(c.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return product;
}
}
ok,所有工作就緒,一套工廠系統完成,接下來就可以讓工廠建造出不同的產品,而且需要新產品只需要實現Product接口即可,實現解耦
public void main() {
Factory factory = new RealFactory();
Product product=factory.createProduct(PhoneProduct.class);
product.dosomething();
}
在Android中的應用
說個比較常見的需求吧,比如老闆讓你設計app中的支付功能,支付方式有很多,以後也有可能添加支付方式。
這時候就可以把支付方式抽象出來,用一個工廠類統一管理,用於返回具體的支付方式類。這樣支付的時候,調用工廠類的方法,把具體支付方式傳給工廠就可以了。
簡單寫下代碼:
public abstract class PayChannel {
public abstract void doInit();
public abstract void doPay();
}
public abstract class PayFactory {
public abstract Product createProduct(Class<? extends PayChannel> c);
}
public class PayFactory extends PayFactory {
public PayChannel createProduct(Class<? extends PayChannel> c) {
//這裏可以做一些統一的操作,比如記錄數據等
PayChannel payChannel = null;
try {
payChannel = (PayChannel) Class.forName(c.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return payChannel;
}
}
public void main() {
PayFactory payFactory = new PayFactory();
PayChannel channel = payFactory.createProduct(WeixinPay.class);
channel.doInit();
channel.doPay();
}
其實我想過爲什麼非要通過工廠這一層呢?直接通過抽象類的實現類執行方法不行嗎?後面我想了下,我的理解是工廠類可以統一管理,並且做一些統一操作,就跟實際的工廠可以統一管理機器生產產品一樣。
如果有說的不對的地方可以一起討論下。