再談工廠模式

2021-09-12 07:06:37 字數 3961 閱讀 2176

之前針對工廠模式做過總結,但是整體較亂,而且再總結工廠模式的演變的時候,例項之間的關聯度不大,這裡重新對這個模式做乙個總結。

這次部落格以乙個學生課外補習班為例,進行例項講解。這個課外補習班提供一些課程供學生學習。

簡單工廠模式估計是每個程式設計師第乙個接觸的設計模式,這種設計模式比較簡單,就好比如乙個小作坊,生產的東西都是固定的,生產模式比較簡單,但是擴充套件性較差。這裡直接上例項

某課外補習班提供英語,數學,以及程式設計課程供學生學習。學生選擇的時候,該補習班提供相關的課程學習方式。

先亮出一些簡單的課程例項

數學課程

/**

* 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 邏輯判斷分支條件,修改了原有的類,我們不但對擴充套件開發了,對修改也開放了,違背了開放 封閉原則。工廠方法模式,定義了乙...