java語言實現創建型模式―簡單工廠模式
來源:程序員人生 發布時間:2015-05-25 08:57:32 閱讀次數:3275次
1、描寫
簡單工廠模式又名靜態工廠方法模式,是所有工廠模式中最簡單的1個,它定義1個具體的工廠類來負責創建所有類的對象并初始化創建的對象,它主要由3部份組成:工廠類、抽象類、實現抽象類的具體類,然后通過客戶端調用工廠類創建相應的對象。
注意:簡單工廠模式不屬于GoF總結的23種設計模式,它是相當于初學java的HelloWorld案例,幫助初學者了解設計模式,增長信心的1個設計模式。
2、簡單工廠模式的優缺點
優點:相對直接在客戶端創建對象并初始化對象的值來講,簡單工廠模式將創建對象和初始化任務交給了工廠類,客戶端只負責對對象的調用,從而明確了各個類的職責。
缺點:只使用1個工廠類來創建各具特點的所有類,當具體產品的種類不斷增加,對創建的方式有所改變時就需要對這個工廠類進行不斷的改變,增加相應的判斷,增加相應的類的創建邏輯,致使工廠類的代碼愈來愈龐大,不利于后期的保護。另外,簡單工廠模式使用靜態方法來創建對象,這樣就致使這個創建對象的靜態方法不能被繼承,只能在這1個類里變得愈來愈臃腫。
總結:雖然簡單工廠模式將對象的創建和初始化工作與客戶端分離了,實現了責任的分配策略,但是所有對象的創建和初始化工作都集中到了1個具體的工廠類中,如果要創建的對象種類繁多,這個工廠類將非常龐大,不利于后期保護。
3、源代碼
1、抽象類
package tong.day4_30.introduce;
/**
* 定義1個薪資接口,所有公司的具體薪資計算都實現這個接口,并重寫計算薪資的方法computeSalary()
* @author tong
*
*/
public interface Salary {
public void computeSalary();
}
2、具體類
package tong.day4_30.introduce;
/**
* 廣東分公司的薪資計算類實現了Salary接口,并重寫了該接口中的計算薪資的方法computeSalary()
* @author Administrator
*
*/
public class GuangdongSalary implements Salary {
@Override
public void computeSalary() {
System.out.println("廣東分公司薪資計算");
}
}
package tong.day4_30.introduce;
/**
* 河北公司的薪資計算類實現了Salary接口,并重寫了該接口中的計算薪資的方法computeSalary()
* @author tong
*
*/
public class HebeiSalary implements Salary{
@Override
public void computeSalary() {
System.out.println("河北分公司薪資計算");
}
}
package tong.day4_30.introduce;
/**
* 浙江分公司的薪資計算類實現了Salary接口,并重寫了該接口中的計算薪資的方法computeSalary()
* @author Administrator
*
*/
public class ZhejiangSalary implements Salary {
@Override
public void computeSalary() {
System.out.println("浙江分公司薪資計算");
}
}
3、簡單工廠類
package tong.day4_30.introduce;
/**
* 簡單工廠類負責所有對象的創建和對象的初始化,這里采取java中的反射機制,根據傳入的參數來創建類的對象
* @author tong
*
*/
public class SimpleFactory {
//根據參數創建對象,這是1個靜態方法可以直接使用類名調用
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 block
e1.printStackTrace();
}catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
}
return salary;
}
}
4、客戶端調用
package tong.day4_30.introduce;
/**
* 在客戶端調用工廠類創建薪資的方法,并輸出結果;
* 如果還想創建更多的公司薪資,那末就創建1個相應的類,在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();
}
}
4、運行結果

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈