1. 程式人生 > >設計模式學習 ——簡單工廠模式、工廠模式、抽象工廠模式

設計模式學習 ——簡單工廠模式、工廠模式、抽象工廠模式

【轉】設計模式學習(二)——簡單工廠模式、工廠模式、抽象工廠模式

最近抽時間將之前看過的“程式人生”公眾號推送的一篇工廠模式的介紹進行了實踐,為了加深自己理解,特將自己的學習理解記錄於此。初識設計模式,就被設計模式的精妙深深吸引,感覺脫離設計模式的程式碼就失去了美麗。作為一個測試,平日寫程式碼的機會肯定不如開發多,但是希望自己能通過努力逐步提升程式碼水平,有一天也能寫出優美的程式碼。如果有對於工廠模式或其他設計模式感興趣的朋友歡迎一起探討。


一、簡單工廠模式


定義:專門定義一個類用來建立其他類的例項,被建立的例項通常具有共同的父類。


場景一:恰巧今天,老大興奮地在群裡說,“我們組明年有三個校招妹子要加入,分別來自武漢科技大學、浙江大學、華東師範大學。她們平時在學校工作都很努力。組裡的單身漢子們可以挑一個妹子,當她的導師,帶領她一起學習,幫助她早日適應公司的節奏。”


下面就是簡單工廠模式的程式碼:


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 extends
BaseMZ {
@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 extends
BaseMZ {
@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方法中會根據不同的引數型別去建立不同的類。


工廠模式:定義一個工廠介面,在實現該介面的各個工廠子類中建立各個不同類的例項。


抽象工廠模式:定義一個工廠介面,提供一系列相關的或相互依賴的類的建立方式。