一、定義
工廠方法模式:將對(duì)象的創(chuàng)建封裝到工廠中去實(shí)現(xiàn)。
說(shuō)道工廠方法模式我們一定會(huì)想到和它相關(guān)聯(lián)的簡(jiǎn)單工廠模式和抽象工廠模式,簡(jiǎn)單工廠模式非常簡(jiǎn)單,這里我們不作討論,抽象工廠模式下節(jié)討論。
二、應(yīng)用場(chǎng)景
當(dāng)我們要?jiǎng)?chuàng)建的對(duì)象種類不確定時(shí),后期有可能改變時(shí),工廠方法模式比較適合。
比如:現(xiàn)在很多app都有消息中心,消息中心里包括很多消息類型,而每種消息類型的樣式又不一樣,并且隨著版本的迭代還會(huì)增加很多消息類型,這時(shí)候用工廠方法模式就再合適不過(guò)了。
三、類圖

四、模式的簡(jiǎn)單實(shí)現(xiàn)
其實(shí)工廠方法模式相對(duì)來(lái)說(shuō)也比較簡(jiǎn)單,接下來(lái)我們還是以賣果汁的小店為例來(lái)演示一下工廠方法。
我們知道果汁店不止一種果汁,根據(jù)多態(tài),我們將果汁抽象化。
public interface IJuice {
void make();
}
接下來(lái)我們實(shí)現(xiàn)幾個(gè)具體的產(chǎn)品,假設(shè)有蘋果汁、芒果汁、草莓汁。
public class AppleJuice implements IJuice{
@Override
public void make() {
System.out.println("make apple juice");
}
}
public class MangoJuice implements IJuice{
@Override
public void make() {
System.out.println("make mango juice");
}
}
public class StrawberryJuice implements IJuice{
@Override
public void make() {
System.out.println("make strawberry juice");
}
}
接下來(lái)是工廠類:
public class JuiceFactory {
public IJuice static makeJuice(String name){
if("apple".equals(name)){
return new AppleJuice();
}else if("mango".equals(name)){
return new MangoJuice();
}else if("strawberry".equals(name)){
return new StrawberryJuice();
}
return null;
}
}
接下來(lái)是場(chǎng)景類:
public class Client {
public static void main(String[] args) {
IJuice juice = JuiceFactory.makeJuice("apple");
juice.make();
}
}
根據(jù)點(diǎn)的果汁名字去制作相應(yīng)的果汁,這時(shí)如果果汁店又加了兩種果汁,葡萄汁和西瓜汁,我們還要去修改相應(yīng)的JuiceFactory類里的邏輯,這會(huì)造成維護(hù)的成本太大,根據(jù)開閉原則,即對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉,我們修改下工廠類,實(shí)現(xiàn)具體工廠生產(chǎn)具體產(chǎn)品。
抽象工廠:
public interface IJuiceFactory {
IJuice makeJuice();
}
具體工廠:
public class AppleJuiceFactory implements IJuiceFactory{
@Override
public IJuice makeJuice() {
return new AppleJuice();
}
}
public class MangoJuiceFactory implements IJuiceFactory{
@Override
public IJuice makeJuice() {
return new MangoJuice();
}
}
public class StrawberryJuiceFactory implements IJuiceFactory{
@Override
public IJuice makeJuice() {
return new StrawberryJuice();
}
}
場(chǎng)景類:
public class Client {
public static void main(String[] args) {
IJuiceFactory juiceFactory = new AppleJuiceFactory();
IJuice juice = juiceFactory.makeJuice();
juice.make();
}
}
假如這時(shí)我們?cè)黾恿似咸阎覀冎恍枰黾右粋€(gè)具體工廠類和具體產(chǎn)品類即可,其他什么都不用改,這樣我們維護(hù)起來(lái)就比較easy。
public class GrapeJuice implements IJuice{
@Override
public void make() {
System.out.println("make grape juice");
}
}
public class GrapeJuiceFactory implements IJuiceFactory{
@Override
public IJuice makeJuice() {
return new GrapeJuice();
}
}
五、總結(jié)
工廠方法模式就是將對(duì)象的創(chuàng)建放到具體的工廠類中去實(shí)現(xiàn),因此對(duì)于多種種類的產(chǎn)品時(shí),可以使用工廠方法模式進(jìn)行解耦。
優(yōu)點(diǎn):擴(kuò)展性比較好,當(dāng)有新的產(chǎn)品產(chǎn)生時(shí),不用修改現(xiàn)有的邏輯,只需要增加一個(gè)產(chǎn)品類和工廠類即可。降低了代碼之間的耦合度,修改一種產(chǎn)品時(shí)并不會(huì)影響其他產(chǎn)品。
缺點(diǎn):當(dāng)產(chǎn)品種類較多時(shí),會(huì)導(dǎo)致類過(guò)多,增加類定義的內(nèi)存開銷。