標籤:java 簡單原廠模式 建立型模式 原始碼 設計模式
一、描述
簡單原廠模式又名靜態Factory 方法模式,是所有原廠模式中最簡單的一個,它定義一個具體的工廠類來負責建立所有類的對象並初始化建立的對象,它主要由3部分組成:工廠類、抽象類別、實現抽象類別的具體類,然後通過用戶端調用工廠類建立相應的對象。
注意:簡單原廠模式不屬於GoF總結的23種設計模式,它是相當於初學java的HelloWorld案例,協助初學者瞭解設計模式,增長信心的一個設計模式。
二、簡單原廠模式的優缺點
優點:相對於直接在用戶端建立對象並初始化對象的值來說,簡單原廠模式將建立對象和初始化任務交給了工廠類,用戶端只負責對對象的調用,從而明確了各個類的職責。
缺點:只使用一個工廠類來建立各具特色的所有類,當具體產品的種類不斷增加,對建立的方式有所改變時就需要對這個工廠類進行不斷的改變,增加相應的判斷,增加相應的類的建立邏輯,導致工廠類的代碼越來越龐大,不利於後期的維護。另外,簡單原廠模式使用靜態方法來建立對象,這樣就導致這個建立對象的靜態方法不能被繼承,只能在這一個類裡變得越來越臃腫。
總結:雖然簡單原廠模式將對象的建立和初始化工作與用戶端分離了,實現了責任的分配策略,但是所有對象的建立和初始化工作都集中到了一個具體的工廠類中,如果要建立的對象種類繁多,這個工廠類將非常龐大,不利於後期維護。
三、原始碼
package tong.day4_30.introduce;/** * 定義一個薪資介面,所有公司的具體薪資計算都實現這個介面,並重寫計算薪資的方法computeSalary() * @author tong * */public interface Salary {public void computeSalary();}
package tong.day4_30.introduce;/** * 廣東分公司的薪資計算類實現了Salary介面,並重寫了該介面中的計算薪資的方法computeSalary() * @author Administrator * */public class GuangdongSalary implements Salary {@Overridepublic void computeSalary() {System.out.println("廣東分公司薪資計算");}}
package tong.day4_30.introduce;/** * 河北公司的薪資計算類實現了Salary介面,並重寫了該介面中的計算薪資的方法computeSalary() * @author tong * */public class HebeiSalary implements Salary{@Overridepublic void computeSalary() {System.out.println("河北分公司薪資計算");}}
package tong.day4_30.introduce;/** * 浙江分公司的薪資計算類實現了Salary介面,並重寫了該介面中的計算薪資的方法computeSalary() * @author Administrator * */public class ZhejiangSalary implements Salary {@Overridepublic void computeSalary() {System.out.println("浙江分公司薪資計算");}}
package tong.day4_30.introduce;/** * 簡單工廠類負責所有對象的建立和對象的初始化,這裡採用java中的反射機制,根據傳入的參數來建立類的對象 * @author tong * */public class SimpleFactory {//根據參數建立對象,這是一個靜態方法可以直接使用類名調用public static Salary createSalary(String name) {Class<Salary> clazz = null;Salary salary = null;try {//利用反射機制擷取該參數對應的類的對象clazz = (Class<Salary>) Class.forName(name);//使用此類對象建立對應的薪資類對象,這裡使用父類指標指向子類對象,實現了多態salary = (Salary)clazz.newInstance();} catch (ClassNotFoundException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}catch (InstantiationException | IllegalAccessException e) {e.printStackTrace();}return salary;}}
package tong.day4_30.introduce;/** * 在用戶端調用工廠類建立薪資的方法,並輸出結果; * 如果還想建立更多的公司薪資,那麼就建立一個相應的類,在Client對象中傳入相應的參數建立相應的對象即可 * @author tong * */public class Client {public static void main(String[] args) {//建立Client對象,以此對象調用computeSalary()方法傳入要型別參數new Client().computeSalary("tong.day4_30.introduce.HebeiSalary");new Client().computeSalary("tong.day4_30.introduce.ZhejiangSalary");new Client().computeSalary("tong.day4_30.introduce.GuangdongSalary");}/** * 根據傳入的參數調用工廠類的建立薪資方法,建立不同的薪資對象 * @param name */public void computeSalary(String name) {//這裡使用多態,根據傳入參數的不同,產生ZhejiangSalary或者HebeiSalary對象Salary salary = SimpleFactory.createSalary(name);//使用產生的對象動態調用具體類對象的方法salary.computeSalary();}}
四、運行結果
java語言實現建立型模式——簡單原廠模式