1. 程式人生 > >大話設計模式之(一)工廠模式

大話設計模式之(一)工廠模式

(大話設計模式)
最近在研究大話設計模式,正好終結一下,以備自己後續檢視。
書中對設計模式分類有28種,今天終結下最為常見的模式,工廠模式。工廠模式有三種:簡單工廠模式,工廠方法模式,抽象工廠模式。
下面說說這三種模式的差異,並一一舉以書中的例子加以說明。
簡單工廠模式:用一個單獨的類來做建立例項的過程,就是一個工廠,以此來增加設計的可擴充套件性,同時要求設計具有鬆耦合性質。下面以計算器為例子來說明。
原生的實現方式我們可以用一個操作類,這裡class名為operation,用多個case來實現多種的操作方式,如:

public static double getResult(double numberA,double numberB,String operation){
		double result=0d;
		switch(operation){
		case "+":
				result=numberA+numberB;
				break;
		case "-":
			result=numberA-numberB;
			break;
		case "*":
			result=numberA*numberB;
			break;
		case "/":
			result=numberA/numberB;
			break;
		}
		return result;
	}

但這種方式的編寫有一個明顯的弊端,如果現在需要擴充套件運算,如開根號運算,就很麻煩。這時候簡單工廠模式就起到作用。定義一個operation 父類

public class Operation {
 private double numberA;
 private double numberb;
public double getNumberA() {
	return numberA;
}
public void setNumberA(double numberA) {
	this.numberA = numberA;
}
public double getNumberb() {
	return numberb;
}
public void setNumberb(double numberb) {
	this.numberb = numberb;
}
 public double GetResut(){
	  double result=0;
	 return result;
 }
}

子類為各運算方法重寫父類getResult方法,如

public class AddOperation extends Operation{
 public double GetResut(){
	double result=0;
	result=getNumberA()+getNumberb();
	 return result;
 }
}

再定義一個工廠類,根據運算子號選擇對應的子類執行,這樣對於開根號運算就可以利用到加減乘除運算,對於新增的執行方法只需增加對應的子類,並在工廠中做相應的增加修改即可。
大家估計已經注意到簡單工廠模式有一個弊端,那就是需要在客戶端知道我要用到的是哪一種執行,並且每增加一種執行就需要在工廠中case一種執行符。
工廠模式很好的解決了這個問題,依然以上面的例子為例,工廠模式將例項化到其子類。定義一個工廠介面

public interface IFactory {
Operation CreateOperaton();
}
將例項化建立增加操作為例如下:

 public class AddFactory implements IFactory{
    
    	@Override
    	public Operation CreateOperaton() {		
    		return new AddOperation();
    	}
    }

因此客戶端的執行只需要例項化對應的運算,即可。需要擴充套件其他執行無需再去修改工廠中的運算程式碼,只需要新建執行類,在實現工廠模式的,即可,完美的滿足開放-封閉的設計原則。
最後,來說說抽象工廠模式,所謂的抽象是指簡單工廠模式中的case條件我們並不事先確定,但裡面的operaton執行基本一致,那我們可以用反射配置的方式來獲取case的內容,從而根據反射的獲取的內容建立到對應的operation操作,值得說明的是所有用簡單工廠模式case得到的operation都可以用反射配置來實現。