1. 程式人生 > >java語言實現建立型模式—簡單工廠模式

java語言實現建立型模式—簡單工廠模式

一、描述

簡單工廠模式又名靜態工廠方法模式,是所有工廠模式中最簡單的一個,它定義一個具體的工廠類來負責建立所有類的物件並初始化建立的物件,它主要由3部分組成:工廠類、抽象類、實現抽象類的具體類,然後通過客戶端呼叫工廠類建立相應的物件。

注意:簡單工廠模式不屬於GoF總結的23種設計模式,它是相當於初學java的HelloWorld案例,幫助初學者瞭解設計模式,增長信心的一個設計模式。

二、簡單工廠模式的優缺點

優點:相對於直接在客戶端建立物件並初始化物件的值來說,簡單工廠模式將建立物件和初始化任務交給了工廠類,客戶端只負責對物件的呼叫,從而明確了各個類的職責。

缺點:只使用一個工廠類來建立各具特色的所有類,當具體產品的種類不斷增加,對建立的方式有所改變時就需要對這個工廠類進行不斷的改變,增加相應的判斷,增加相應的類的建立邏輯,導致工廠類的程式碼越來越龐大,不利於後期的維護。另外,簡單工廠模式使用靜態方法來建立物件,這樣就導致這個建立物件的靜態方法不能被繼承,只能在這一個類裡變得越來越臃腫。

總結:雖然簡單工廠模式將物件的建立和初始化工作與客戶端分離了,實現了責任的分配策略,但是所有物件的建立和初始化工作都集中到了一個具體的工廠類中,如果要建立的物件種類繁多,這個工廠類將非常龐大,不利於後期維護。

三、原始碼

1、抽象類

package tong.day4_30.introduce;
/**
 * 定義一個薪資介面,所有公司的具體薪資計算都實現這個介面,並重寫計算薪資的方法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 {	
	//根據引數建立物件,這是一個靜態方法可以直接使用類名呼叫
	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;
/**
 * 在客戶端呼叫工廠類建立薪資的方法,並輸出結果;
 * 如果還想建立更多的公司薪資,那麼就建立一個相應的類,在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();
	}
}


四、執行結果

簡單工廠模式