介紹:
工廠方法模式屬于創(chuàng)建型模式塑娇。定義一個(gè)用戶創(chuàng)建對(duì)象的接口翁涤,讓子類決定實(shí)例化哪一個(gè)類。工廠方法使一個(gè)類的實(shí)例化延遲到其子類延旧。
類圖:
Product(抽象產(chǎn)品類):需要?jiǎng)?chuàng)建的產(chǎn)品的抽象類卓箫。
ConcreteProduct(具體產(chǎn)品類):為實(shí)現(xiàn)抽象產(chǎn)品的某個(gè)具體產(chǎn)品類。
Factory(抽象工廠類):工廠模式方法核心垄潮,返回一個(gè)Product類型的對(duì)象烹卒。
ConcreteFactory(具體工廠類):實(shí)現(xiàn)具體業(yè)務(wù)邏輯闷盔,返回ConcreteProduct實(shí)例。
用法:
? 在任何需要生成復(fù)雜對(duì)象的地方旅急,都可以使用工廠方法模式逢勾。
? 如果一個(gè)對(duì)象擁有很多子類,創(chuàng)建該對(duì)象的子類時(shí)可以使用工廠方法模式藐吮。
個(gè)人理解:如果創(chuàng)建某個(gè)對(duì)象時(shí)需要進(jìn)行許多額外的操作(不能直接new的時(shí)候)溺拱,又或者存在一個(gè)類有很多子類,用工廠方法創(chuàng)建那些類不但可以面向接口的編程谣辞,也便于維護(hù)與管理各種子類迫摔。
例子:
工廠方法模式比較簡(jiǎn)單,我們知道在項(xiàng)目中數(shù)據(jù)持久化的方式有很多種泥从,例如SQLite數(shù)據(jù)庫(kù)存儲(chǔ)句占、XML文件存儲(chǔ)、普通文件存儲(chǔ)等躯嫉。每種方式就是常規(guī)的增刪改查操作纱烘,我們一起試一下吧:
需求:用三種方式實(shí)現(xiàn)數(shù)據(jù)化持久存儲(chǔ)
1、運(yùn)用工廠方法模式
先看一波類圖祈餐,結(jié)構(gòu)復(fù)雜嗎擂啥?非常復(fù)雜,但這就是工廠模式的結(jié)構(gòu)帆阳,是沒(méi)問(wèn)題的哺壶。我們不急先試一下怎么運(yùn)用這個(gè)模式。
1.1蜒谤、創(chuàng)建一個(gè)產(chǎn)品抽象類
public abstract class IOHandler {
public abstract void add(String key,String value);
public abstract void remove(String key);
public abstract void update(String key,String value);
public abstract void query(String key);
}
對(duì)數(shù)據(jù)的操作方法無(wú)論用到那種方式变骡,都離不開(kāi)增刪改查的方法,因此我們將以上4個(gè)方法抽象出抽象產(chǎn)品類芭逝。
1.2塌碌、創(chuàng)建具體產(chǎn)品類,實(shí)現(xiàn)業(yè)務(wù)邏輯
public class FileHandler extends IOHandler {
@Override
public void add(String key, String value) {
System.out.println("FileHanlder:添加一條記錄");
}
@Override
public void remove(String key) {
System.out.println("FileHanlder:刪除一條記錄");
}
@Override
public void update(String key, String value) {
System.out.println("FileHanlder:更新一條記錄");
}
@Override
public void query(String key) {
System.out.println("FileHanlder:查詢一條記錄");
}
}
public class DBHandler extends IOHandler {
@Override
public void add(String key, String value) {
System.out.println("DBHandler:添加一條記錄");
}
@Override
public void remove(String key) {
System.out.println("DBHandler:刪除一條記錄");
}
@Override
public void update(String key, String value) {
System.out.println("DBHandler:更新一條記錄");
}
@Override
public void query(String key) {
System.out.println("DBHandler:查詢一條記錄");
}
}
public class XMLHandler extends IOHandler {
@Override
public void add(String key, String value) {
System.out.println("XMLHandler:添加一條記錄");
}
@Override
public void remove(String key) {
System.out.println("XMLHandler:刪除一條記錄");
}
@Override
public void update(String key, String value) {
System.out.println("XMLHandler:更新一條記錄");
}
@Override
public void query(String key) {
System.out.println("XMLHandler:查詢一條記錄");
}
}
每種存儲(chǔ)方式實(shí)現(xiàn)旬盯。例如DBHandler實(shí)現(xiàn)上肯定是運(yùn)用到數(shù)據(jù)庫(kù)的一些方法台妆,F(xiàn)ileHandler肯定也用到文件存儲(chǔ)的方法。具體存儲(chǔ)操作的內(nèi)容就不多說(shuō)了大家可以參考其他資料胖翰,這里用控制臺(tái)輸出表示接剩。
1.3、創(chuàng)建抽象工廠類
public abstract class IOFactory {
public abstract IOHandler getHandler();
}
很簡(jiǎn)單萨咳,定義獲得公共方法的接口懊缺,表示子類將會(huì)創(chuàng)建一個(gè)IOHandler的對(duì)象。
1.4、創(chuàng)建具體工廠類
public class FileFactory extends IOFactory {
@Override
public IOHandler getHandler() {
return new FileHandler();
}
}
public class DBFactory extends IOFactory {
@Override
public IOHandler getHandler() {
return new DBHandler();
}
}
public class XMLFactory extends IOFactory {
@Override
public IOHandler getHandler() {
return new XMLHandler();
}
}
各個(gè)工廠分別生成各自的產(chǎn)品鹃两。
1.5遗座、使用及輸出結(jié)果
public class Client {
public static void main(String[] args) {
IOFactory factory = new XMLFactory();
IOHandler handler = factory.getHandler();
handler.add("name","小明");
handler.update("name","小紅");
handler.query("name");
handler.remove("name");
}
}
XMLHandler:添加一條記錄
XMLHandler:更新一條記錄
XMLHandler:查詢一條記錄
XMLHandler:刪除一條記錄
總結(jié)一下,我們已經(jīng)完成了工廠方法模式的使用了俊扳,如果新增存儲(chǔ)方式的話就新增工廠類和新增具體產(chǎn)品類途蒋。生成復(fù)雜對(duì)象時(shí),無(wú)需知道具體類名馋记,只需知道相應(yīng)的工廠方法即可号坡。但其實(shí)過(guò)多的類必然會(huì)導(dǎo)致結(jié)構(gòu)復(fù)雜化,這也是難以避免的梯醒。所以某些簡(jiǎn)單的情況下可以權(quán)衡是否使用工廠模式了宽堆。
2、工廠方法模式VS簡(jiǎn)單工廠模式
在簡(jiǎn)單工廠模式中茸习,確定只有一個(gè)工廠的情況去實(shí)現(xiàn)業(yè)務(wù)邏輯畜隶,被視為是工廠方法模式的一種弱化版本。
2.1逮光、用簡(jiǎn)單工廠模式實(shí)現(xiàn)上述業(yè)務(wù)
public class IOEasyFactory {
public static IOHandler getHandler(Class<? extends IOHandler> clz) {
IOHandler handler = null;
try {
handler = (IOHandler) Class.forName(clz.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return handler;
}
}
用了Java反射的方式去實(shí)現(xiàn),否則的話就傳入類型然后用if-else判斷的方式去實(shí)現(xiàn)墩划。
2.2涕刚、使用及輸出結(jié)果
public class Client {
public static void main(String[] args) {
IOHandler handler = IOEasyFactory.getHandler(DBHandler.class);
handler.add("name","小明");
handler.update("name","小紅");
handler.query("name");
handler.remove("name");
}
}
DBHandler:添加一條記錄
DBHandler:更新一條記錄
DBHandler:查詢一條記錄
DBHandler:刪除一條記錄
2.3、總結(jié)對(duì)比
簡(jiǎn)單工廠模式的最大優(yōu)點(diǎn)在于工廠類中包含了必要的邏輯判斷乙帮,根據(jù)客戶端的選擇條件動(dòng)態(tài)實(shí)例化相關(guān)的類杜漠。簡(jiǎn)單工廠模式只需要知道工廠類中代表具體產(chǎn)品的參數(shù)即可。
工廠方法模式實(shí)現(xiàn)時(shí)察净,客戶端需要決定實(shí)例化哪一個(gè)工廠來(lái)實(shí)現(xiàn)相關(guān)的類驾茴,選擇判斷的問(wèn)題還是存在的,工廠方法把簡(jiǎn)單工廠的內(nèi)部判斷邏輯轉(zhuǎn)移到了客戶端中進(jìn)行氢卡。工廠方法模式只需要知道具體工廠類即可锈至。
感謝您的閱讀~
轉(zhuǎn)載請(qǐng)注明出處喔:http://www.reibang.com/p/f3c1057b989b
推薦閱讀
基礎(chǔ)篇:
設(shè)計(jì)模式前篇之——UML類圖必會(huì)知識(shí)點(diǎn)
設(shè)計(jì)模式前篇之——一起過(guò)一下面向?qū)ο蟮母拍?/a>
創(chuàng)建型模式:
簡(jiǎn)易理解設(shè)計(jì)模式之:簡(jiǎn)單工廠模式——來(lái)試試接入支付功能
簡(jiǎn)易理解設(shè)計(jì)模式之:工廠方法模式——數(shù)據(jù)存儲(chǔ)例子
簡(jiǎn)易理解設(shè)計(jì)模式之:抽象工廠模式——更換數(shù)據(jù)庫(kù)例子
簡(jiǎn)易理解設(shè)計(jì)模式之:建造者模式——學(xué)習(xí)使用“鏈?zhǔn)秸{(diào)用”
簡(jiǎn)易理解設(shè)計(jì)模式之:原型模式——深、淺拷貝的概念
簡(jiǎn)易理解設(shè)計(jì)模式之:?jiǎn)卫J健獑卫J降膸追N常用寫法
結(jié)構(gòu)型模式:
簡(jiǎn)易理解設(shè)計(jì)模式之:適配器模式——Android列表視圖控件設(shè)計(jì)方式
簡(jiǎn)易理解設(shè)計(jì)模式之:橋接模式——穿衣服經(jīng)典案例2
簡(jiǎn)易理解設(shè)計(jì)模式之:組合模式——實(shí)現(xiàn)View中的樹(shù)狀結(jié)構(gòu)
簡(jiǎn)易理解設(shè)計(jì)模式之:裝飾模式——穿衣服經(jīng)典案例
簡(jiǎn)易理解設(shè)計(jì)模式之:外觀模式——第三方SDK的幫助類
簡(jiǎn)易理解設(shè)計(jì)模式之:享元模式——五子棋游戲例子
簡(jiǎn)易理解設(shè)計(jì)模式之:代理模式——iOS視圖控件設(shè)計(jì)方式
行為型模式:
簡(jiǎn)易理解設(shè)計(jì)模式之:策略模式——優(yōu)化一下支付功能
簡(jiǎn)易理解設(shè)計(jì)模式之:模板方法模式——Android中的BaseActivity基類
簡(jiǎn)易理解設(shè)計(jì)模式之:觀察者模式——監(jiān)聽(tīng)與回調(diào)
簡(jiǎn)易理解設(shè)計(jì)模式之:狀態(tài)模式——優(yōu)化登錄操作
簡(jiǎn)易理解設(shè)計(jì)模式之:備忘錄模式——Word文檔的工作原理
簡(jiǎn)易理解設(shè)計(jì)模式之:迭代器模式——遍歷對(duì)象的好幫手
簡(jiǎn)易理解設(shè)計(jì)模式之:命令模式——實(shí)現(xiàn)命令的參數(shù)化配置
簡(jiǎn)易理解設(shè)計(jì)模式之:責(zé)任鏈模式——OA中請(qǐng)假流程示例
簡(jiǎn)易理解設(shè)計(jì)模式之:中介者模式——多人聊天室例子
簡(jiǎn)易理解設(shè)計(jì)模式之:解釋器模式——語(yǔ)言和文法
簡(jiǎn)易理解設(shè)計(jì)模式之:訪問(wèn)者模式——員工考核例子