設計模式學習 ——簡單工廠模式、工廠模式、抽象工廠模式
【轉】設計模式學習(二)——簡單工廠模式、工廠模式、抽象工廠模式
最近抽時間將之前看過的“程式人生”公眾號推送的一篇工廠模式的介紹進行了實踐,為了加深自己理解,特將自己的學習理解記錄於此。初識設計模式,就被設計模式的精妙深深吸引,感覺脫離設計模式的程式碼就失去了美麗。作為一個測試,平日寫程式碼的機會肯定不如開發多,但是希望自己能通過努力逐步提升程式碼水平,有一天也能寫出優美的程式碼。如果有對於工廠模式或其他設計模式感興趣的朋友歡迎一起探討。
一、簡單工廠模式
定義:專門定義一個類用來建立其他類的例項,被建立的例項通常具有共同的父類。
場景一:恰巧今天,老大興奮地在群裡說,“我們組明年有三個校招妹子要加入,分別來自武漢科技大學、浙江大學、華東師範大學。她們平時在學校工作都很努力。組裡的單身漢子們可以挑一個妹子,當她的導師,帶領她一起學習,幫助她早日適應公司的節奏。”
下面就是簡單工廠模式的程式碼:
1. 建立一個妹子基類
public abstract class BaseMZ {
public abstract void self_introduce();
public void work(){
System.out.println("Work hard..");
}
}
2. 建立妹子型別,可以用列舉
public enum MZType {
WU_HAN_KE_JI,
HUA_DONG_SHI_FAN,
ZHE_JIANG
}
3. 建立妹子子類
public class WuHanKeJiMZ extendsBaseMZ {
@Override
public void self_introduce() {
System.out.println("I am from WuHanKeji University.");
}
}
public class HuaDongShiFanMZ extends BaseMZ {
@Override
public void self_introduce() {
System.out.println("I am from HuaDongShiFan University.");
}
}
public class ZheJiangMZ extendsBaseMZ {
@Override
public void self_introduce() {
System.out.println("I am from ZheJiang University.");
}
}
4. 建立“妹子工廠”
public class MZFactory {
public static BaseMM createMZ(MZType mzType){
switch(mzType){
case WU_HAN_KE_JI:
return new WuHanKeJiMZ();
case HUA_DONG_SHI_FAN:
return new HuaDongShiFanMZ();
default:
case ZHE_JIANG:
return new ZheJiangMZ();
}
}
}
5. 建立程式執行類Main
public static void main(String[] args) {
BaseMZ whkjMZ = MZFactory.createMZ(MZType.WU_HAN_KE_JI);
BaseMZ hdsfMZ = MZFactory.createMZ(MZType.HUA_DONG_SHI_FAN);
BaseMZ zjMZ = MZFactory.createMZ(MZType.ZHE_JIANG);
whkjMZ.self_introduce();
whkjMZ.work();
hdsfMZ.self_introduce();
hdsfMZ.work();
zjMZ.self_introduce();
zjMZ.work();
}
6. 執行結果
可見,簡單工廠模式可以根據不同的引數,來建立不同的例項物件,並且返回的是基類的引用,使得程式提高了一定的靈活性。
二、工廠模式
定義:定義一個用於建立物件的介面,讓子類決定例項化哪一個類。工廠方法使一個類的例項化延遲到其子類。
場景二:剛過了一天,老大又說,“又要進來一個清華大學的妹子啦,誰要帶?”
如果還是使用簡單工廠模式,那麼我們不得不在MZType裡再增加一個清華妹子,並且還要在switch裡增加對清華妹子型別的判斷。如果哪天又來了各種學校的妹子,我們還得重複同樣的操作,程式將變得不那麼靈活。這時候我們就可以考慮工廠模式。
下面就是工廠模式的程式碼:
1. 建立一個妹子基類,跟簡單工廠模式相同
public abstract class BaseMZ {
public abstract void self_introduce();
public void work(){
System.out.println("Work hard..");
}
}
2. 建立妹子子類
public class QingHuaMZ extends BaseMZ {
@Override
public void self_introduce() {
System.out.println("I am from QingHua University.");
}
}
3. 建立“妹子工廠”介面
public interface IMZFactory {
public BaseMZ createMZ();
}
4. 建立“妹子工廠”類
public class QingHuaMZFactory implements IMZFactory{
@Override
public BaseMZ createMZ() {
return new QingHuaMZ();
}
}
5. 建立程式執行類Main
public class Main {
public static void main(String[] args) {
BaseMZ qhMZ = new QingHuaMZFactory().createMZ();
qhMZ.self_introduce();
qhMZ.work();
}
}
6. 執行結果
可見,與簡單工廠模式相比,工廠模式提供了一個建立各個具體子類的介面,我們可以通過不同的子類工廠來建立不同的子類,再次增加了靈活性,將不同子類之間的關係進一步解耦。
三、抽象工廠模式
定義:提供一個建立一系列相關或者相互依賴物件的介面,而無需指定他們具體的類.
場景三:又過了一天,老大又在群裡說,“聽她們的同學說,武漢科技大學的妹子前端技術好,浙江大學的妹子吉他彈的贊,華東師範大學的妹子人長得漂亮。”
這時候我們可能就需要建立一個與妹子相關的“妹子同學”類,我們可以在“妹子工廠”裡宣告這些相關的類,表明這些類之間的相關性,同時通過這個工廠可以製造這一系列相關類的具體例項。
下面就是抽象工廠模式的程式碼:
1. 建立一個妹子基類,跟前面相同
public abstract class BaseMZ {
public abstract void self_introduce();
public void work(){
System.out.println("Work hard..");
}
}
2. 建立各個妹子子類
public class HuaDongShiFanMZ extends BaseMZ {
@Override
public void self_introduce() {
System.out.println("I am from HuaDongShiFan University.");
}
}
public class ZheJiangMZ extends BaseMZ {
@Override
public void self_introduce() {
System.out.println("I am from ZheJiang University.");
}
}
3. 建立妹子同學介面
public interface IMZClassmates {
public void giveComments();
}
4. 建立各個妹子同學類
public class HuaDongShiFanMZClassmates implements IMZClassmates {
@Override
public void giveComments() {
System.out.println("Looks so beautiful.");
}
}
public class ZheJiangMZClassmates implements IMZClassmates{
@Override
public void giveComments() {
System.out.println("Good at playing guitar.");
}
}
5. 建立“妹子工廠”介面
public interface IMZFactory {
public BaseMZ createMZ();
public IMZClassmates createMZClassmates();
}
6. 建立各個“妹子工廠”
public class HuaDongShiFanMZFactory implements IMZFactory{
@Override
public BaseMZ createMZ() {
return new HuaDongShiFanMZ();
}
@Override
public IMZClassmates createMZClassmates() {
return new HuaDongShiFanMZClassmates();
}
}
public class ZheJiangMZFactory implements IMZFactory{
@Override
public BaseMZ createMZ() {
return new ZheJiangMZ();
}
@Override
public IMZClassmates createMZClassmates() {
return new ZheJiangMZClassmates();
}
}
7. 建立程式執行類Main
public class Main {</span><span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">void</span><span style="color: #000000"> main(String[] args) { HuaDongShiFanMZFactory huaDongShiFanMZFactory </span>= <span style="color: #0000ff">new</span><span style="color: #000000"> HuaDongShiFanMZFactory(); BaseMZ hdsfMZ </span>=<span style="color: #000000"> huaDongShiFanMZFactory.createMZ(); IMZClassmates hdsfMZClassmates </span>=<span style="color: #000000"> huaDongShiFanMZFactory.createMZClassmates(); ZheJiangMZFactory zheJiangMZFactory </span>= <span style="color: #0000ff">new</span><span style="color: #000000"> ZheJiangMZFactory(); BaseMZ zjMz </span>=<span style="color: #000000"> zheJiangMZFactory.createMZ(); IMZClassmates zjMZClassmates </span>=<span style="color: #000000"> zheJiangMZFactory.createMZClassmates(); hdsfMZ.self_introduce(); hdsfMZ.work(); hdsfMZClassmates.giveComments(); zjMz.self_introduce(); zjMz.work(); zjMZClassmates.giveComments(); }
}
8. 執行結果
總結
簡單工廠模式:專門定義一個工廠類用來建立其他類的例項,在工廠create方法中會根據不同的引數型別去建立不同的類。
工廠模式:定義一個工廠介面,在實現該介面的各個工廠子類中建立各個不同類的例項。
抽象工廠模式:定義一個工廠介面,提供一系列相關的或相互依賴的類的建立方式。