基于第一章的簡單工廠模式 我們會發(fā)現這個簡單工廠有很大的限制。從現實生活上來看,太不專業(yè)了,你一個簡單工廠可以創(chuàng)造任何牌子的牛奶。這在實際上也是行不通的。除非類似于拼夕夕那里的產品工廠。在真正的實際中,不同品牌的牛奶因為具體的制作工藝其他的相關原料等問題肯定不會是一個工廠來制造。
舉個栗子
/**
* 工廠方法的本源,工廠接口
*奶企的常規(guī)操作,生成牛奶
*/
public interface IMilkFactory {
IMilkcreateMilk();
}
蒙牛、伊利、三元分別有自己的工廠來實現生產牛奶的功能
public class MengniuFactoryimplements IMilkFactory {
@Override
public IMilkcreateMilk() {
return new MengniuMilk();
}
}
public class SanYuanFactoryimplements IMilkFactory {
@Override
public IMilkcreateMilk() {
return new SanYuanMilk();
}
}
public class YiLiFactoryimplements IMilkFactory {
@Override
public IMilkcreateMilk() {
return new YiLiMilk();
}
}
三個工廠已經創(chuàng)建完畢,并且已經實現了生成各自牛奶的功能
我們的具體測試類如下
public class FuncFactoryTest {
public static void main(String[] args) {
IMilk mengNiu =new MengniuFactory().createMilk();
IMilk yiLi =new YiLiFactory().createMilk();
IMilk sanYuan =new SanYuanFactory().createMilk();
System.out.println(mengNiu.createMilk());
System.out.println(yiLi.createMilk());
System.out.println(sanYuan.createMilk());
}
}
類圖如下:
image
特點
在以上實例里,通過定義一個抽象的核心工廠類,并定義創(chuàng)建產品對象的接口,創(chuàng)建具體產品實例的工作延遲到其工廠子類去完成。這樣做的好處是核心類只關注工廠類的接口定義,而具體的產品實例交給具體的工廠子類去創(chuàng)建。當系統(tǒng)需要新增一個產品是,無需修改現有系統(tǒng)代碼,只需要添加一個具體產品類和其對應的工廠子類,使系統(tǒng)的擴展性變得很好,符合面向對象編程的開閉原則。在工廠方法模式中,核心的工廠類不再負責所有產品的創(chuàng)建,而是將具體創(chuàng)建工作交給子類去做。這個核心類僅僅負責給出具體工廠必須實現的接口,而不負責產品類被實例化這種細節(jié),這使得工廠方法模式可以允許系統(tǒng)在不修改工廠角色的情況下引進新產品。
缺點
我們的客戶端自己來實現具體的工廠創(chuàng)建。假如某個具體產品類需要進行一定的修改,很可能需要修改對應的工廠類。