設計模式——簡單工廠模式

工廠模式,是用工廠方法代替new來創建對象的一種模式。通過這種模式使代碼更容易擴展,接下來我們以簡單計算器爲例爲說明。

一、需求分析

1、輸入操作A,操作數B及運算符“+,-,*,/”,然後根據運算符作相應的運算

2、返回運算結果

二、編碼前思考

通過什麼樣的方法使得我們的代碼易維護,易擴展,易複用?

這四種運算的共同點是:

a、都有2個操作數A,B

b、都返回計算結果

不同點是:計算方式不同

那麼,我們就可以把相同點封裝在一個父類Operator裏面,代碼如下:

public abstract class  Operator 
{
	protected double operatorA;
	protected double operatorB;
	protected double result;
	private String[] opStr = new String[]{"+","-","*","/"};
	public static class operator
	{
		public static final short ADD = 0;
		public static final short MINUS = 1;
		public static final short MUL = 2;
		public static final short DIV = 3;
	}
	
	public Operator(double a,double b)
	{
		this.operatorA = a;
		this.operatorB = b;
	}
	
	public abstract double getResult();
	
	public void printf(short op)
	{
		System.out.println(this.operatorA + this.opStr[op]+this.operatorB+"="+this.result);
	}
}

接下來就可以分別寫加、減、乘、除四個類來繼承Operator類。

加法類:

public class OperatorAdd extends Operator 
{
public OperatorAdd(double a, double b) {
super(a, b);
// TODO Auto-generated constructor stub
}
@Override
public double getResult() 
{
this.result = this.operatorA + this.operatorB;
this.printf(Operator.operator.ADD);
return this.result;
}
}

減法類:

public class OperatorMinus extends Operator {
public OperatorMinus(double a, double b) {
super(a, b);
// TODO Auto-generated constructor stub
}
@Override
public double getResult() 
{
this.result = this.operatorA - this.operatorB;
this.printf(Operator.operator.MINUS);
return this.result;
}
}

乘法類:

public class OperatorMul extends Operator {
public OperatorMul(double a, double b) {
super(a, b);
// TODO Auto-generated constructor stub
}
@Override
public double getResult() 
{
this.result = this.operatorA * this.operatorB;
this.printf(Operator.operator.MUL);
return this.result;
}
}

除法類:

public class OperatorDiv extends Operator {
public OperatorDiv(double a, double b) {
super(a, b);
// TODO Auto-generated constructor stub
}
@Override
public double getResult() 
{
if(this.operatorB == 0)
{
try {
System.out.println("除數不能爲0");
throw new Exception();
} catch (Exception e) {
e.printStackTrace();
}
}else{
this.result = this.operatorA / this.operatorB;
this.printf(Operator.operator.DIV);
}
return this.result;
}
}

工廠類來負責對應對象的初始化:

public class OperatorFactory 
{
public static Operator operatorMake(double a,double b,short op)
{
Operator operator = null;
switch(op)
{
case Operator.operator.ADD:
operator = new OperatorAdd(a,b);
break;
case Operator.operator.MINUS:
operator = new OperatorMinus(a,b);
break;
case Operator.operator.MUL:
operator = new OperatorMul(a,b);
break;
case Operator.operator.DIV:
operator = new OperatorDiv(a,b);
break;
}
return operator;
}
}


測試:

public class MyOperator
{
public static void main(String[] args)
{
Operator op = null;
//加法
op = OperatorFactory.operatorMake(33, 6, Operator.operator.ADD);
op.getResult();
//減法
op = OperatorFactory.operatorMake(99, 82, Operator.operator.MINUS);
op.getResult();
//乘法
op = OperatorFactory.operatorMake(23, 8, Operator.operator.MUL);
op.getResult();
//除法
op = OperatorFactory.operatorMake(150, 3, Operator.operator.DIV);
op.getResult();
}
}

輸出效果:

33.0+6.0=39.0

99.0-82.0=17.0

23.0*8.0=184.0

150.0/3.0=50.0


如果還要其他運算,比如開根,平方等,則只需要繼承Operator類,然後在工廠類裏面加上相應的對象初始化即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章