1. 程式人生 > >設計模式-簡單工廠模式/靜態工廠方法(Static Factory Method)

設計模式-簡單工廠模式/靜態工廠方法(Static Factory Method)

使用原因

同一個呼叫,需要不同物件。統一通過工廠生產不同物件,建立物件的邏輯在工廠中。

定義

簡單工廠模式是屬於建立型模式,又叫做靜態工廠方法(Static Factory Method)模式,不屬於23種GOF設計模式。簡單工廠模式是由一個工廠物件決定創建出哪一種產品類的例項。是工廠模式家族中最簡單實用的模式,可以理解為是不同工廠模式的一個特殊實現。

優點 工廠類是整個模式的關鍵.包含了必要的邏輯判斷,根據外界給定的資訊,決定該建立哪個具體類的物件.通過使用工廠類,外界不需要直接建立物件,直接通過工廠獲取需要的物件就可以了。而不必管這些物件究竟如何建立及如何組織的.明確了各自的職責和權利,有利於整個
軟體體系結構
的優化。 缺點 由於工廠類集中了所有例項的建立邏輯,違反了高內聚責任分配原則,將全部建立邏輯集中到了一個工廠類中;它所能建立的類只能是事先考慮到的,如果需要新增新的類,則就需要改變工廠類了。(修改產品改產品,增加產品需要改工廠和產品)

ps.以上內容來自百度百科

示例:

工廠根據傳入的資料,生產出相應的物件

//計算方式 工廠類,用於生產相應的演算法子類
public class OperationFactory {
	
	public  Operation getOperation(String operator){
		Operation oa = null;
		switch(operator){
			case "+":
				oa = new AddOperation();
				return oa;
			case "-":
				oa = new SubtractOperation();
				return oa;
			/*case "*":
				oa = new MultiplicationOperation();
				return oa;
			case "/":
				oa = new DivisionOperation();
				return oa;*/			
		}
		return null;
	}
}

//演算法介面 定義方法
public interface Operation {  
    public double getResult(double numA, double numB);  
} 

//演算法實現類,由工廠類建立,重寫父類中的虛擬函式       加減乘除都需要有單獨的類
public class AddOperation implements Operation {

	@Override
	public double getResult(double numA, double numB) {
		// TODO Auto-generated method stub
		return numA + numB;
	}

}
........
//測試類
import java.util.Scanner;

public class MainProgream {
	public static void main(String args[]){
		while(true){
			try{
				Scanner input =new Scanner(System.in);
				System.out.println("input numA");
		                String instr = input.nextLine();
		                double numA = Double.parseDouble(instr); 
				System.out.println("input numB");
				instr = input.nextLine();
				double numB = Double.parseDouble(instr);
				System.out.println("input + - * / ");
				instr = input.nextLine();
				String operator = instr;
				System.out.print(numA + operator + numB + "=" );
				Operation o = new OperationFactory().getOperation(operator);
				
				System.out.println(o.getResult(numA, numB));
				
			}catch(Exception e){
				System.out.println("輸入格式不對");
			}
		}
	}
}