工廠方法模式
相關原始碼
logback的體現
綜述 學習設計模式,最最最核心的一點就是,模式的適用場景,如果脫離的業務場景,或者適用場景,為了模式而模式,那…反而對自己原有的編碼習慣造成巨大衝擊,最後只能是走火入魔了。
對於工廠方法模式,我們可以先回想平常編碼中建立物件的方式。
我們通常建立物件就是:new。例如:
/** 第一種 建立,然後各種set,這個佔比應該很高 */
aaa aaa =
newaaa()
;aaa.
seta
("a");
aaa.
setx
("x");
// ...
/** 第二種 直接全參或者有參構造,目前自己見的少一些 */
aaa aaa =
newaaa
("a"
,"x"
,"...");
/** 第三種 根據不同情況建立不同的物件 */if(
"a".
equals
(type)
)elseif(
"b".
equals
(type)
)else
上面**中展示的,有乙個共同點,客戶端(要建立某個物件的類)在建立某個物件的時候,必須知道這個物件張什麼樣子,應該給什麼引數,相當於是直接和物件本身的類打交道。這麼做有什麼弊端嗎?
定義個建立物件的介面,但是讓實現這個介面的類來決定例項化哪個類。工廠方法讓類的例項建立推遲到子類實現。文字描述有些乾枯,往下,看**和uml。
開閉原則:物件導向程式設計中,開閉原則規定,軟體中的物件(類,模組,方法)應該對於擴充套件開放,對於修改關閉。什麼叫做擴充套件?就是可以新增。什麼叫做修改,就是在當前類新增**。code的過程並不是直接上手,而是進行業務分析,產出技術文件之後,然後進行編碼。所以大多時候,都是在設計和除錯(找bug)。編碼的過程其實只占用了20%左右的時間。
業務場景
業務分析
模型抽象
廠商 uml
這樣在進行品牌擴充套件的時候,只需要新增品牌冰箱,以及對應品牌廠商即可。符合開閉原則,且重複的建立物件過程被一同封裝在了工廠中
編碼
/**
* 冰箱
* */
public
abstract
class
fridge
protected
abstract
void
show()
;}
/**
* 格力冰箱
*/public
class
greefridge
extends
fridge
@override
protected
void
show()
}
/**
* 海爾冰箱
*/public
class
haierfridge
extends
fridge
@override
protected
void
show()
}
/**
* 美的冰箱
*/public
class
mideafridge
extends
fridge
@override
protected
void
show()
}
/**
* 冰箱工廠
* */
public
inte***ce
fridgefactory
/**
* 格力冰箱工廠
*/public
class
greefridgefactory
implements
fridgefactory
}
/**
* 海爾冰箱工廠
*/public
class
haierfridgefactory
implements
fridgefactory
}
/**
* 美的冰箱工廠
*/public
class
mideafridgefactory
implements
fridgefactory
}
/**
* 客戶端
*/public
class
maintest
// 展示建立結果
fridge.
show();}}
collection
collection有個iterator功能。這個功能就是獲取乙個迭代器。collection有很多實現類,每乙個實現類中有它自己的迭代器,我們在獲取迭代器的時候,只需要指定某個collection的實現類,然後獲取迭代器即可。
與冰箱業務場景的對應關係:
urlstreamhandle***ctory
這個…偷個懶,讀者可以自己分析一下。
記不記得**中通常會有這麼一行
private
static
final logger logger = logge***ctory.
getlogger
(aaaa.
class
);
這個獲取乙個日誌記錄的物件,也是使用的工廠方法模式。同時這個裡面不僅僅只有工廠方法模式,還有單例模式,等等,所以一款優秀的框架,它裡面的各種設計,是非常有講究的,這也是為什麼閱讀開源框架原始碼,對自己而言會有很大提公升的原因之一。
工廠方法模式最最最核心的2點:
工廠方法模式 工廠方法模式
工廠方法模式是簡單工廠模式的公升級版,簡單工廠模式不符合設計模式的原則 即 單一職責,開閉原則 優點 職責明確,擴充套件方便 缺點 需要建立多個工廠 實現步驟 1.將工廠通用方法抽取介面 例如 ifactory 2.將產品抽取介面 例如 icar 3.實現各種產品 例如 baomacar,benti...
工廠方法模式 工廠方法模式 二
工廠方法模式是對簡單工廠的進一步抽象和封裝,需要新的類物件時不需要對既有工廠類進行修改,而是增加新的工廠類。工程類可以使用模版進一步封裝,由編譯器來生成 從而減少 編寫工作量。工廠方法的 c 實現01part產品抽象基類class animal virtual void show 0 02part產...
工廠方法模式(一) 簡單工廠方法模式
ps 第二篇學習部落格,堅持就是勝利。繼續設計模式的學習,記錄工廠模式,加深自己的理解。基本結構 abstractproduct 用來定義基本的商品的抽象 public abstract class abstractphoneproduct 用來實現抽象商品,生成各種商品 public class ...