java 工廠模式的作用,為什么要用工廠模式以及示例演示


1 工廠模式的作用,為什么要用工廠模式?

工廠模式是為了解耦:把對象的創建和使用的過程分開。就是Class A 想調用Class B,那么只是調用B的方法,而至於B的實例化,就交給工廠類。

工廠模式可以降低代碼重復。如果創建B過程都很復雜,需要一定的代碼量,而且很多地方都要用到,那么就會有很多的重復代碼。可以把這些創建對象B的代碼放到工廠里統一管理。既減少了重復代碼,也方便以后對B的維護。

工廠模式可以減少錯誤,因為工廠管理了對象的創建邏輯,使用者不需要知道具體的創建過程,只管使用即可,減少了使用者因為創建邏輯導致的錯誤。

 

2.工廠模式的一些適用場景:

 對象的創建過程/實例化准備工作很復雜,需要很多初始化參數,查詢數據庫等

類本身有好多子類,這些類的創建過程在業務中容易發生改變,或者對類的調用容易發生改變

 

3.示例演示

下面實現一個加減乘除的工廠方法模式

package demo8;
/**
 * 工廠接口
 *
 */
interface IFactory {
	Operation CreateOperation();
}
package demo8;
/**
 * 具體工廠(Concrete Creator)角色:加法類工廠
 *
 */
public class AddFactory implements IFactory {
	@Override
	public Operation CreateOperation() {
		return new OperationAdd();
	}	
}
package demo8;
/**
 * 具體工廠(Concrete Creator)角色:減法類工廠
 *
 */
public class SubFactory implements IFactory {
	@Override
	public Operation CreateOperation() {		
		return new OperationSub();
	}
}
package demo8;
/**
 * 具體工廠(Concrete Creator)角色:乘法類工廠
 *
 */
public class MulFactory implements IFactory {
	@Override
	public Operation CreateOperation() {		
		return new OperationMul();
	}
}
package demo8;
/**
 * 具體工廠(Concrete Creator)角色:除法類工廠
 *
 */
public class DivFactory implements IFactory {
	@Override
	public Operation CreateOperation() {		
		return new OperationDiv();
	}
}
package demo8;
/**
 * 抽象產品(Product)角色:運算類
 *
 */
public abstract class Operation {
	private double numberA = 0;
	private double numberB = 0;
	public void setNumberA(double numberA) {
		this.numberA = numberA;
	}
	public void setNumberB(double numberB) {
		this.numberB = numberB;
	}
	public double getNumberA() {
		return numberA;
	}
	public double getNumberB() {
		return numberB;
	}
	public double getResult() {
		double result = 0;
		return result;
	}	
}
package demo8;
/**
 * 具體產品(Concrete Product)角色:加法類
 *
 */
public class OperationAdd extends Operation {	
	@Override
	public double getResult() {
		double result = 0;
		result = super.getNumberA() + super.getNumberB();
		return result;
	}
}
package demo8;
/**
 * 具體產品(Concrete Product)角色:減法類
 *
 */
public class OperationSub extends Operation {	
	@Override
	public double getResult() {
		double result = 0;
		result = super.getNumberA() - super.getNumberB();
		return result;
	}
}
package demo8;
/**
 * 具體產品(Concrete Product)角色:乘法類
 *
 */
public class OperationMul extends Operation {
	@Override
	public double getResult() {
		double result = 0;
		result = super.getNumberA() * super.getNumberB();
		return result;
	}
}
package demo8;
/**
 * 具體產品(Concrete Product)角色:除法類
 *
 */
public class OperationDiv extends Operation {
	@Override
	public double getResult() {
		double result = 0;
		if (super.getNumberB() == 0)			
			throw new ArithmeticException("除數不能為0.");			
		result = super.getNumberA() / super.getNumberB();
		return result;
	}
}
package demo8;
/**
 * 客戶端
 *
 */
public class Demo8 {
	public static void main(String[] args) {
		IFactory operFactory = new AddFactory();		
		Operation oper = operFactory.CreateOperation();
		oper.setNumberA(10);
		oper.setNumberB(7);
		double result = oper.getResult();
		System.out.println(result);
	}
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM