工廠(chǎng)方法模式是創(chuàng)建性設(shè)計(jì)模式之一,一般用于復(fù)雜對(duì)象的創(chuàng)建
該系列其他文章:
- 安卓設(shè)計(jì)模式(一)面向?qū)ο罅笤O(shè)計(jì)原則
- 安卓設(shè)計(jì)模式(二)單例模式
- 安卓設(shè)計(jì)模式(三)Builder模式
- 安卓設(shè)計(jì)模式(四)裝飾者模式
- 安卓設(shè)計(jì)模式(五)代理模式
- 安卓設(shè)計(jì)模式(六)策略模式
- 安卓設(shè)計(jì)模式(七)模板方法模式
- 安卓設(shè)計(jì)模式(八)工廠(chǎng)方法模式
定義: 定義一個(gè)用于創(chuàng)建對(duì)象的接口(非指interface),讓子類(lèi)決定實(shí)例化哪個(gè)類(lèi)
使用場(chǎng)景: 創(chuàng)建復(fù)雜對(duì)象,且有多種功能相同的對(duì)象
實(shí)現(xiàn)舉例
下面以Androd經(jīng)常用到的緩存Cache來(lái)舉例說(shuō)明:
緩存接口,定義所有緩存必須實(shí)現(xiàn)的方法
public interface ICache {
String get(String key);
void put(String key, String value);
void removeCache(String key);
void clearCache();
}
工廠(chǎng)方法根據(jù)需求又用幾種不同的實(shí)現(xiàn),不過(guò)思想是一致的,下面分別說(shuō)明
1. 簡(jiǎn)單工廠(chǎng)(靜態(tài)工廠(chǎng))
如果我們程序中整體只需要一種緩存即可,不需要多種緩存,如磁盤(pán)緩存,所以只需要單一緩存子類(lèi)及單一工廠(chǎng)即可:
/**
* 磁盤(pán)緩存,具體方法實(shí)現(xiàn)省略
*/
public class DiskCache implements ICache {
@Override
public String get(String key) {
return null;
}
@Override
public void put(String key, String value) {
}
@Override
public void removeCache(String key) {
}
@Override
public void clearCache() {
}
}
/**
* 簡(jiǎn)單工廠(chǎng),只創(chuàng)建一種緩存
*/
public class StaticCacheFactory {
public static ICache create() {//注意這里直接使用static方法
return new DiskCache();
}
}
//使用
ICache iCache = StaticCacheFactory.create();
iCache.get("");
2. 工廠(chǎng)與產(chǎn)品一對(duì)一,即每個(gè)工廠(chǎng)負(fù)責(zé)生產(chǎn)一種產(chǎn)品
/**
* 工廠(chǎng)接口,定義所有工廠(chǎng)的必須實(shí)現(xiàn)的方法
*/
public interface ICacheFactory {
ICache create();//創(chuàng)建緩存
}
/**
* 磁盤(pán)緩存工廠(chǎng),用于生產(chǎn)磁盤(pán)緩存實(shí)例
*/
public class DiskFactory implements ICacheFactory {
@Override
public ICache create() {
return new DiskCache();
}
}
/**
* 內(nèi)存緩存工廠(chǎng),用于生產(chǎn)內(nèi)存緩存實(shí)例
*/
public class MemoryFactory implements ICacheFactory {
@Override
public ICache create() {
return new MemoryCache();
}
}
//使用:
ICacheFactory factory = new DiskFactory();
//如果需要內(nèi)存緩存
//ICacheFactory factory = new MemoryFactory();
ICache iCache = factory.create();
iCache.clearCache();
3. 工廠(chǎng)與產(chǎn)品一對(duì)多,即每個(gè)工廠(chǎng)可以生產(chǎn)多種產(chǎn)品
工廠(chǎng)接口,定義所有工廠(chǎng)的必須實(shí)現(xiàn)的方法:
public interface ICacheFactory {
<T extends ICache> T create(Class<T> c);//創(chuàng)建緩存實(shí)例
}
具體工廠(chǎng),可根據(jù)需求生產(chǎn)不同的產(chǎn)品:
public class CacheFactory implements ICacheFactory {
@Override
public <T extends ICache> T create(Class<T> c) {
T cache = null;
try {
cache = (T) Class.forName(c.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return cache;
}
}
使用:
ICacheFactory cacheFactory = new CacheFactory();
ICache diskCache = cacheFactory.create(DiskCache.class);//根據(jù)類(lèi)型創(chuàng)建不同的緩存實(shí)例
ICache memoryCache = cacheFactory.create(MemoryCache.class);//根據(jù)類(lèi)型創(chuàng)建不同的緩存實(shí)例
diskCache.clearCache();
memoryCache.clearCache();
總結(jié)
由以上可以的舉例可以看到使用工廠(chǎng)方法創(chuàng)建對(duì)象簡(jiǎn)單明了,如果上面的緩存對(duì)象創(chuàng)建時(shí)需要設(shè)置很多參數(shù),初始化數(shù)據(jù)等等,那么使用工廠(chǎng)方法模式相對(duì)于直接new一個(gè)實(shí)例有很大優(yōu)勢(shì).工廠(chǎng)方法模式將對(duì)象的創(chuàng)建過(guò)程封裝在工廠(chǎng)中,使得客戶(hù)端無(wú)需再關(guān)心實(shí)例的創(chuàng)建和初始化過(guò)程.
實(shí)際開(kāi)發(fā)中第三種使用的比較多,根據(jù)需求創(chuàng)建不同實(shí)例.
關(guān)于作者
- 簡(jiǎn) 書(shū):uncochen
- github:ChenZhen
- 新浪微博:@Chen丶振
- Email:18620156376@163.com