示例一:
@Data // 註解方式生成get set 方法
abstract class Operation { // 抽象類 ,繼承使用方法和字段
private Double numberA;
private Double numberB;
public Double getResult(){
return 0D;
}
}
public class Add extends Operation { // 加法運算類
public Double getResult(){
return getNumberA() + getNumberB(); // 獲取父類屬性進行運算
}
}
public class Subtraction extends Operation{ // 減法運算類
public Double getResult(){
return getNumberA() - getNumberB();
}
}
public class OperationFactory { // 調用類
public static void main(String[] args) {
String operator = "+";
Operation add = createOperator(operator); // 多態
add.setNumberA(10D);
add.setNumberB(10D);
System.out.println(add.getResult());
}
// 不適用if else原因:switch case會生成一個跳轉表來指示實際的case分支的地址,而if…else卻需要遍歷條件分支直到命中條件, 效率switch更高,時間換空間
private static Operation createOperator(String operator){ // 匹配算數運算符
Operation operation = null;
switch (operator){
case "+":
operation = new Add();
break;
case "-":
operation = new Subtraction();
break;
default:
System.out.println("輸入有誤");
}
return operation;
}
}
示例二:
package com.mybatis.designpatterns.simplefactory.cash;
public class Cash {
/**
* 收銀系統:
* 需求:1.客戶買賣東西正常收費
* 2.打折收費
* 3.返利
* @param args
*/
public static void main(String[] args) {
String type = "正常收費";
String type2 = "打折";
String type3 = "促銷";
CashSuper cash = cash(type2);
System.out.println(cash.acceptCash(1000D));
}
private static CashSuper cash(String type){
CashSuper cashSuper = null;
switch (type){
case "正常收費":
cashSuper = new CashNormal();
break;
case "打折":
cashSuper = new CashDiscount(0.8);
break;
case "促銷":
cashSuper = new CashPromotion(300D,100D);
break;
default:
System.out.println("輸入有誤");
}
return cashSuper;
}
}
package com.mybatis.designpatterns.simplefactory.cash;
/**
* 收費超類
*/
abstract class CashSuper {
public abstract Double acceptCash(Double money);
}
package com.mybatis.designpatterns.simplefactory.cash;
/**
* 促銷
*/
public class CashPromotion extends CashSuper{
private Double promotionPrivate; // 促銷價格
private Double promotionRebate; // 返利
public CashPromotion(Double promotionPrivate, Double promotionRebate) {
this.promotionPrivate = promotionPrivate;
this.promotionRebate = promotionRebate;
}
@Override
public Double acceptCash(Double money) {
if (money >= promotionPrivate){
return money - money / promotionPrivate * promotionRebate;
}
return money; // 收原價
}
}
package com.mybatis.designpatterns.simplefactory.cash;
/**
*
*原價
*
*/
public class CashNormal extends CashSuper {
@Override
public Double acceptCash(Double money) {
return money;
}
}
package com.mybatis.designpatterns.simplefactory.cash;
/**
* 打折
*/
public class CashDiscount extends CashSuper{
private Double discount = 1D; //默認不打折
public CashDiscount(Double discount) {
this.discount = discount;
}
@Override
public Double acceptCash(Double money){
return money * discount;
}
}
感受:需掌握和靈活運用繼承及多態知識,代碼量感覺多了很多,真雞兒麻煩.