一薛躬、定義
工廠方法模式:將對象的創(chuàng)建封裝到工廠中去實(shí)現(xiàn)粒氧。
說道工廠方法模式我們一定會想到和它相關(guān)聯(lián)的簡單工廠模式和抽象工廠模式度迂,簡單工廠模式非常簡單敌买,這里我們不作討論简珠,抽象工廠模式下節(jié)討論。
二虹钮、應(yīng)用場景
當(dāng)我們要?jiǎng)?chuàng)建的對象種類不確定時(shí)聋庵,后期有可能改變時(shí),工廠方法模式比較適合芜抒。
比如:現(xiàn)在很多app都有消息中心珍策,消息中心里包括很多消息類型,而每種消息類型的樣式又不一樣宅倒,并且隨著版本的迭代還會增加很多消息類型攘宙,這時(shí)候用工廠方法模式就再合適不過了。
三拐迁、類圖
四蹭劈、模式的簡單實(shí)現(xiàn)
其實(shí)工廠方法模式相對來說也比較簡單,接下來我們還是以賣果汁的小店為例來演示一下工廠方法线召。
我們知道果汁店不止一種果汁铺韧,根據(jù)多態(tài),我們將果汁抽象化缓淹。
public interface IJuice {
void make();
}
接下來我們實(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");
}
}
接下來是工廠類:
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;
}
}
接下來是場景類:
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類里的邏輯,這會造成維護(hù)的成本太大躏吊,根據(jù)開閉原則氛改,即對擴(kuò)展開放,對修改關(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();
}
}
場景類:
public class Client {
public static void main(String[] args) {
IJuiceFactory juiceFactory = new AppleJuiceFactory();
IJuice juice = juiceFactory.makeJuice();
juice.make();
}
}
假如這時(shí)我們增加了葡萄汁凳怨,我們只需要增加一個(gè)具體工廠類和具體產(chǎn)品類即可瑰艘,其他什么都不用改是鬼,這樣我們維護(hù)起來就比較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é)
工廠方法模式就是將對象的創(chuàng)建放到具體的工廠類中去實(shí)現(xiàn)均蜜,因此對于多種種類的產(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í)并不會影響其他產(chǎn)品匪蟀。
缺點(diǎn):當(dāng)產(chǎn)品種類較多時(shí)椎麦,會導(dǎo)致類過多,增加類定義的內(nèi)存開銷材彪。