1. 程式人生 > >大話設計模式之簡單工廠模式

大話設計模式之簡單工廠模式

該部落格主要參考內容如下:

什麼是簡單工廠模式 

簡單工廠模式(Simple Factory Pattern):又稱為靜態工廠方法(Static Factory Method)模式,它屬於類建立型模式。在簡單工廠模式中,可以根據引數的不同返回不同類的例項。簡單工廠模式專門定義一個類來負責建立其他類的例項,被建立的例項通常都具有共同的父類。說白了:就是建立物件的

簡單工廠模式的組成

工廠類(Factory):簡單工廠模式的核心,用來建立物件。

抽象產品類(Product):它一般是具體產品要繼承的父類或者要實現的介面。

具體產品角色(ConcreteProduct):工廠類所建立的物件就是此角色的例項

如何使用簡單工廠模式

假如有這樣一個需求:寫一個計算器 實現 + - x  /,你怎麼做

第一段程式碼

/**
 * 一.問自己
 * 1.這樣的程式,維護,擴充套件,複用性,靈活性 怎麼樣,是不是很差
 * 2.這樣寫相當於寫死了,是不是,如果需求有變動,重新寫一次?不可能,對不對
 * 二.怎麼辦,想一下
 * 1.首先想到 面向物件:封裝,繼承,多型,來提高:維護,擴充套件,複用性,靈活性
 * 2.利用封裝,將邏輯層面與控制層面分開
 * 三.看第二層程式碼
 * 
 * */
public class Test {

	public static void main(String[] args) {
		
		  System.out.print("輸入數字A:");
		  Scanner   scan =new Scanner(System.in);
		 String numberA = scan.nextLine();
		  System.out.println("輸入運算子 +  -  x  /:"); 
		  Scanner  operator =new Scanner(System.in);
		  String operatorSelect = scan.nextLine();
		  System.out.println("輸入數字B:"); 
		  Scanner  scanB =new Scanner(System.in); 
		  String numberB = scan.nextLine();
		  String result="";
		  double parseDouble =00d;
		  switch (operatorSelect) {
		case "+":
			parseDouble=Double.parseDouble(numberA)+Double.parseDouble(numberB);
			System.out.println(parseDouble);
			break;
		case "-":
			parseDouble=Double.parseDouble(numberA)-Double.parseDouble(numberB);
			System.out.println(parseDouble);
			break;
		case "x":
			parseDouble=Double.parseDouble(numberA)*Double.parseDouble(numberB);
			System.out.println(parseDouble);
			break;
		case "/":
			if (!numberB.equals("0")) {
				parseDouble=Double.parseDouble(numberA)/Double.parseDouble(numberB);
				System.out.println(parseDouble);
			}else {
				result="除數不能為0";
				System.out.println(result);
			}
			break;	
		default:
			System.out.println("運算子輸入有誤");
			break;
		}
	}
}

 第二部分

public class Test1 {
/***
 * 一.看了第二層程式碼,問自己
 * 1.這樣實現了我們說的問題了嗎,她只是把邏輯層面封裝起來了,是不是
 * 2.如果我們要加一個開根運算呢,在邏輯層面加一個case 語句,是這樣嗎,如果是這樣,就不要看往下看了
 * 3.增加一個運算型別,萬一你增加case語句,修改了其他其他case語句的內容,其他case 語句是別人寫的,你改了,會不會揍你,
 * 別說你不會,小心駛得萬年船
 * 二。怎麼辦,想一下
 * 1.既然不能在一個類裡,這樣容易影響其他運算型別,那就分開來,每種方法都寫一個類,這樣就不會影響了吧
 * 2.看第三層程式碼
 * 
 * */
public static void main(String[] args) {
//	第一個數字
	 System.out.print("輸入數字A:");
	  Scanner   scan =new Scanner(System.in);
	 String numberA = scan.nextLine();
	 double numberAa = Double.parseDouble(numberA);
//	 運算子
	  System.out.println("輸入運算子 +  -  x  /:"); 
	  Scanner  operator =new Scanner(System.in);
	  String operatorSelect = scan.nextLine();
//	  第二個數字
	  System.out.println("輸入數字B:"); 
	  Scanner  scanB =new Scanner(System.in); 
	  String numberB = scan.nextLine();
	  double numberBb = Double.parseDouble(numberB);
//	  呼叫封裝的方法
	  Operation.getResult(numberAa, operatorSelect, numberBb);
}
}
public class Operation {

	public static void getResult(Double numberAa,String opera,Double numberBb) {
		String errorResult="除數不能為0";
		  double result =00d;
		  switch (opera) {
		case "+":
			result=numberAa+numberBb;
			System.out.println(result);
			break;
		case "-":
			result=numberAa-numberBb;
			System.out.println(result);
			break;
		case "x":
			result=numberAa*numberBb;
			System.out.println(result);
			break;
		case "/":
			
			if (numberBb!=0) {
				result=numberAa/numberBb;
				System.out.println(result);
			}else {
				System.out.println(errorResult);
			}
			break;
		default:
			System.out.println("運算子輸入有誤");
			break;
		}
		} 
}

第三部分

/**
 * 基類  加 減 成  除 的共性
 * */
public class OperationA {
  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 result(Double numberA,Double numberB){
	  double result=0;
	return result;
  }
}

加法

public class Add extends OperationA{
	 public double result(Double numberA,Double numberB){
		  double result=0;
		  result=numberA+numberB;
		  System.out.println(result);
		return result;
	  }
}

減法

public class Sub extends OperationA{
	public double result(Double numberA,Double numberB){
		  double result=0;
		  result=numberA-numberB;
		  System.out.println(result);
		return result;
	  }
}

乘法

public class Mul extends OperationA{
	public double result(Double numberA,Double numberB){
		  double result=0;
		  result=numberA*numberB;
		  System.out.println(result);
		return result;
	  }
}

除法

public class Div extends OperationA{
	public double result(Double numberA,Double numberB){
		  double result=0;
		  if (numberB!=0) {
			  result=numberA/numberB;
			  System.out.println(result);
		}else {
			System.out.println("除數不能為0");
		}
		  
		return result;
	  }
}

工廠

public class OperationFactory {
	
  public  static OperationA getOperation(String opera) {
	  
	  OperationA operationA=null;
	  
	  switch (opera) {
	case "+":
		operationA=new Add();
		break;
	case "-":
		operationA=new Sub();
		break;
	case "X":
		operationA=new Mul();
		break;
	case "/":
		operationA=new Div();
		break;
	case "%":
		operationA=new yushu();
		break;	
	default:
		System.out.println("運算子輸入有誤");
	}
	return operationA;
	  
  }
}

呼叫

public class Test3 {
/**
 * 一。看第三層程式碼有,問自己
 * 1.這層程式碼都幹嘛了,有沒有實現:維護,擴充套件,複用性,靈活性
 * 2.分析:2.1每種運算都有自己獨立的類,需要那種用那種,具有靈活性,複用性也強
 *         2.2 擴充套件:當需要一個其他方法時(求餘數),增加對應的類,並且在工廠裡新增該類即可
 *         2.3:維護:如果要修改加法,只需要在add 類做修改,而不是一個 什麼都有的類裡修改,不會修改其他運算的核心演算法,便於維護
 *   二,這就是簡單工廠模式      
 * */
	
public static void main(String[] args) {
//1.	+ - x /   的基類
	OperationA operation=null;
//2.	根據不同的運算獲得不同的物件(工廠模式)
	operation = OperationFactory.getOperation("+");
	double result = operation.result(3.1, 2.2);
	System.out.println(result);
}
}