1、簡(jiǎn)介
簡(jiǎn)單工廠(chǎng)模式是一個(gè)對(duì)象創(chuàng)建型模式,它定義了一個(gè)用于創(chuàng)建對(duì)象的接口,讓子類(lèi)決定實(shí)例化哪一個(gè)類(lèi),它使得一個(gè)類(lèi)的實(shí)例化延遲到了子類(lèi)。
2、使用場(chǎng)景
為什么要使用工廠(chǎng)模式,它能幫助解決什么問(wèn)題?面向?qū)ο蟮姆庋b(Encapsulation)和分派(Delegation)告訴我們,盡量將長(zhǎng)的代碼分派“切割”成每段,將每段再“封裝”起來(lái)(減少段和段之間偶合聯(lián)系性),這樣就會(huì)將風(fēng)險(xiǎn)分散,以后如果需要修改,只要更改每段,不會(huì)再發(fā)生牽一動(dòng)百的事情了。使用工廠(chǎng)模式,能夠?qū)?chuàng)建實(shí)例和使用實(shí)例分開(kāi),封裝了使用者將得到那些具體類(lèi)的信息,并且隱藏了這些類(lèi)的實(shí)例是如何被創(chuàng)建和放在一起的。
3、類(lèi)圖
4、實(shí)例
先看看Product接口:
package simpleFactory;
public interface Product {
public void doSth();
}
再看看和他關(guān)聯(lián)的具體的類(lèi):
package simpleFactory;
public class ConcreteProduct1 implements Product {
public void doSth(){
System.out.print("this is product1");
}
}
package simpleFactory;
public class ConcreteProduct2 implements Product {
public void doSth(){
System.out.print("this is product2");
}
}
package simpleFactory;
public class ConcreteProduct3 implements Product {
public void doSth(){
System.out.print("this is product3");
}
}
package simpleFactory;
public class ConcreteProduct4 implements Product {
public void doSth(){
System.out.print("this is product4");
}
}
最后是工廠(chǎng)方法的核心類(lèi):
package simpleFactory;
public class Creator {
public static Product productFactory(int which) {
switch(which){
case 1:
return new ConcreteProduct1();
break;
case 2:
return new ConcreteProduct2();
break;
case 3:
return new ConcreteProduct3();
break;
case 4:
return new ConcreteProduct4();
break;
default:
return null;
}
}
}
5、優(yōu)缺點(diǎn)
優(yōu)點(diǎn)如下:
客戶(hù)類(lèi)和工廠(chǎng)類(lèi)分開(kāi)。消費(fèi)者任何時(shí)候需要某種產(chǎn)品,只需向工廠(chǎng)請(qǐng)求即可。消費(fèi)者無(wú)須修改就可以接納新產(chǎn)品。
缺點(diǎn)也很明顯:
當(dāng)產(chǎn)品修改時(shí),工廠(chǎng)類(lèi)也要做相應(yīng)的修改。有點(diǎn)違背了開(kāi)—閉原則。