FactoryMethod:工廠方法模式
先代碼
父類或接口類:
package h.ldemo.factorymethod;
/**
*
* @author: Is-Me-Hl
* @date: 2020年1月31日
* @Description: Demo--簡單工廠模式
* SuperClassOrInterface:表示父類或者接口都行,此處兩者代碼都會給出,大同小異
*/
/*public abstract class SuperClassOrInterface {
// 抽象方法
public abstract void doSomeThings();
// 非抽象方法
public void doThings(){
System.out.println("SuperClassOrInterface:doThings...");
}
}*/
public interface SuperClassOrInterface{
public void doSomeThings();
}
子類或實現類(兩個):
package h.ldemo.factorymethod;
/**
*
* @author: Is-Me-Hl
* @date: 2020年1月31日
* @Description: 子類1:繼承或實現
*/
/*public class SubClassOrImplClass1 extends SuperClassOrInterface {
*//**
* 實現抽象方法
*//*
@Override
public void doSomeThings() {
// TODO Auto-generated method stub
System.out.println("SubClassOrImplClass1:doSomeThings...");
}
*//**
* 子類重寫父類方法
* @Override 可以校驗該方法是不是在父類(超類)中存在
*//*
@Override
public void doThings(){
System.out.println("SubClassOrImplClass1:doThings...");
}
}*/
public class SubClassOrImplClass1 implements SuperClassOrInterface {
/**
* 實現接口中指定的行爲
*/
@Override
public void doSomeThings() {
// TODO Auto-generated method stub
System.out.println("SubClassOrImplClass1:doSomeThings...");
}
}
package h.ldemo.factorymethod;
/**
*
* @author: Is-Me-Hl
* @date: 2020年1月31日
* @Description: 子類2:繼承或實現
*/
/*public class SubClassOrImplClass2 extends SuperClassOrInterface {
*//**
* 實現抽象方法
*//*
@Override
public void doSomeThings() {
// TODO Auto-generated method stub
System.out.println("SubClassOrImplClass2:doSomeThings...");
}
*//**
* 子類重寫父類方法
* @Override 可以校驗該方法是不是在父類(超類)中存在
*//*
@Override
public void doThings(){
System.out.println("SubClassOrImplClass2:doThings...");
}
}*/
public class SubClassOrImplClass2 implements SuperClassOrInterface {
/**
* 實現接口中指定的行爲
*/
@Override
public void doSomeThings() {
// TODO Auto-generated method stub
System.out.println("SubClassOrImplClass2:doSomeThings...");
}
}
抽象工廠或接口工廠:
package h.ldemo.factorymethod;
/**
*
* @author: Is-Me-Hl
* @date: 2020年2月15日
* @Description: 抽象工廠或接口工廠
*/
public abstract class SuperFactoryOrFactoryInterface {
// 此處以抽象類爲例,接口方式類似
// 獲取實例
public abstract SuperClassOrInterface getInstance();
}
抽象工廠或接口工廠子類(舉例兩個):
package h.ldemo.factorymethod;
public class SubFactoryOrFactoryImpl1 extends SuperFactoryOrFactoryInterface {
@Override
public SuperClassOrInterface getInstance() {
// TODO Auto-generated method stub
System.out.println("具體工廠1實例化-->具體對象1...");
return new SubClassOrImplClass1();
}
}
package h.ldemo.factorymethod;
public class SubFactoryOrFactoryImpl2 extends SuperFactoryOrFactoryInterface {
@Override
public SuperClassOrInterface getInstance() {
// TODO Auto-generated method stub
System.out.println("具體工廠2實例化-->具體對象2...");
return new SubClassOrImplClass2();
}
}
測試類:
package h.ldemo.factorymethod;
/**
*
* @author: Is-Me-Hl
* @date: 2020年1月31日
* @Description: 測試
*/
public class TestMainEnter {
public static void main(String[] args) {
SuperFactoryOrFactoryInterface superFactory = new SubFactoryOrFactoryImpl1();
superFactory.getInstance().doSomeThings();
System.out.println("---------------------");
superFactory = new SubFactoryOrFactoryImpl2();
superFactory.getInstance().doSomeThings();
}
}
測試結果:
後分析
- 個人建議:寫代碼是件幸福的事,So,do it
工廠方法模式,定義一個用於創建對象的接口,讓子類決定實例化哪一個類。工廠方法使一個類的實例化延遲到其子類。
簡單工廠VS工廠方法:
簡單工廠模式的最大優點在於工廠類中包含了必要的邏輯判斷,根據客戶端的選擇條件動態實例化相關的類,對於客戶端來說,去除了與具體產品的依賴。如簡單工廠模式博客中講的計算機的例子,你完成了加減乘除,但你需要計算次方的時候,你還需要對工廠進行修改,添加對應的case,這可不是一個好辦法,就等於說,他們不但對擴展開放了,對修改也開放了,這個就違背了開放-封閉原則。那麼工廠模式就發揮作用了。如上述代碼所寫的,我們每添加一個新的功能,只需要增加具體類和相應的工廠類即可,這就滿足了開閉原則。
總結:工廠方法模式克服了簡單工廠模式違背的開放-封閉原則的缺點,又保持了封裝對象創建過程的優點。使得更換對象時,不需要做太大的改動就可以實現,降低了客戶程序與產品對象的耦合。可以說,工廠方法是簡單工廠模式的進一步抽象和推廣。由於使用了多態性,工廠方法模式保持了簡單工廠模式的優點,而且克服了它的缺點。但工廠方法模式本身也存在瑕疵,由於每增加一個產品,就要添加一個產品工廠類,增加了額外的開發量。
其他例子:參考自《大話設計模式》雷鋒工廠
注:以上文章僅是個人總結,若有不當之處,望不吝賜教