之前針對工廠模式做過總結,但是整體較亂,而且再總結工廠模式的演變的時候,例項之間的關聯度不大,這裡重新對這個模式做乙個總結。
這次部落格以乙個學生課外補習班為例,進行例項講解。這個課外補習班提供一些課程供學生學習。
簡單工廠模式估計是每個程式設計師第乙個接觸的設計模式,這種設計模式比較簡單,就好比如乙個小作坊,生產的東西都是固定的,生產模式比較簡單,但是擴充套件性較差。這裡直接上例項
某課外補習班提供英語,數學,以及程式設計課程供學生學習。學生選擇的時候,該補習班提供相關的課程學習方式。
先亮出一些簡單的課程例項
數學課程
/**
* autor:liman
* comment:數學課程
*/public class mathcourse implements icourse
}
英語課程
/**
* autor:liman
* comment:英語課程
*/public class englishcourse implements icourse
}
程式設計課程
/**
* autor:liman
* comment:程式設計課程
*/public class codingcourse implements icourse
}
課程的抽象介面:
/**
* autor:liman
* comment: 課程介面
*/public inte***ce icourse
建立這些課程的工廠:
package com.learn.designmodel.factory.******factory;
import org.apache.commons.lang.stringutils;
/** * autor:liman
* comment: 建立課程的工廠
*/public class coursefactory else if ("mathcourse".equals(coursename)) else if ("codingcourse".equals(coursename)) else
}/**
* 消除if else 利用反射
** @param classname
* @return
*/public icourse getcoursebyclassname(string classname)
} catch (exception e)
return null;
}/**
* 直接根據類物件來進行反射
* @param clazz
* @return
*/public icourse getcoursebyclazz(class clazz)
} catch (exception e)
return null;}}
測試類:
package com.learn.designmodel.factory.******factory;
/** * autor:liman
* comment:簡單工廠測試類
*/public class ******factorytest
}
這裡說明一下,最為原始的方式就是不斷的if else,根據輸入不同的字串決定新建那個課程。如果使用者輸入的字串沒有指定的課程,那就會直接丟擲空指標異常,上述**的注釋部分就是如此。後面的兩個方法是為了解決if....else的操作,利用了反射和類載入機制。但是簡單工廠的模式的弊端依舊沒有解決。
簡單工廠的模式問題很多,如果補習班想增加乙個中文課程,除了增加乙個chinesecourse物件之外,還需要修改coursefactory類中的getcourse方法。當然利用反射沒有這個問題,但是空指標的問題並不太好解決。即使利用反射也需要知道具體的課程物件。十分不利於擴充套件。
工廠方法模式相比簡單工廠模式改變了建立工廠的方式,如果想要建立數學課程,就將建立的工作交給數學課程工廠,如果需要建立英語課程,就將建立的工作交給英語工廠。但是這些工廠也有統一的介面或者抽象類來管理。
課程工廠的介面
/**
* autor:liman
* comment:
*/public inte***ce coursefactory
英語課程工廠
/**
* autor:liman
* comment:
*/public class englishcoursefactory implements coursefactory
}
數學課程工廠
/**
* autor:liman
* comment:
*/public class mathcoursefactory implements coursefactory
}
程式設計課程工廠
/**
* autor:liman
* comment:
*/public class codingcoursefactory implements coursefactory
}
測試**:
package com.learn.designmodel.factory.factorymethod;
/** * autor:liman
* comment:
*/public class factorymethodtest
}
擴充套件的時候,只需要增加乙個新的目標類,然後乙個新的工廠類就可以了,從擴充套件的角度來說是夠了,但是如果擴充套件的課程很多,除了中文課程,還有藝術課程,這樣會造成類檔案很多。這種方式已經能較好的滿足擴充套件性了。但是,乙個工廠就能生產乙個課程。這裡只貼出數學課程的例項:
coursefactory擴充套件不同的產品
package com.learn.designmodel.factory.abstractfactory;
/** * autor:liman
* comment:
*/public inte***ce coursefactory
數學課程工廠
/**
* autor:liman
* comment:
*/public class mathcoursefactory implements coursefactory
@override
public ipractise createpractise()
@override
public iexam createexam()
}
測試**:
package com.learn.designmodel.factory.abstractfactory;
/** * autor:liman
* comment:
*/public class abstractfactorytest
}
執行結果:
其實針對程式設計課程,沒有實現考試的功能,這就好比,不同的工廠有不同的生產線,有的工廠能生產電飯煲,電視和冰箱,而有的工廠只能生產電飯煲和電視。
再談工廠出差體驗
這次出差和往次不同,因為這次沒有leader,但後來證明這是個錯誤,下面慢慢道來。之前的案子做的還算順利,但這次的案子換了另一批人,需要磨合是正常的,但似乎並非易事。在這兒我就事論事,絕不針對個人。先講一下前提,這次出差有三部分人。一部分是我們,負責test program,簡稱a。另一部分是做im...
簡單工廠模式,工廠模式,抽象工廠模式
三種模式看了一天,記錄下自己的理解 headfirst,比薩店為例 1,簡單工廠模式 乙個具體的工廠類 pizzafactory 乙個抽象的產品類pizza,可以派生出多個具體的產品類 客戶 pizzastore類 工廠類 pizzafactory類關聯產品類pizza,工廠生產出不同型別的pizz...
簡單工廠模式 工廠模式 抽象工廠模式
簡單工廠模式 簡單工廠模式的最大優點在於工廠類中包含了必要的邏輯判斷,根據客戶端的選擇條件動態例項化相關類,對於客戶端來說,去除了與具體產品的依賴。但增加功能時,需增加 case 邏輯判斷分支條件,修改了原有的類,我們不但對擴充套件開發了,對修改也開放了,違背了開放 封閉原則。工廠方法模式,定義了乙...