디자인 모델 노트 - 간단 한 공장 모델 과 전략 모델

23258 단어 디자인 모드
단순 공장 모드
대상 을 만 들 때 들 어 오 는 매개 변수의 값 을 통 해 실례 화 할 대상 을 결정 합 니 다.
단점: 기능 을 증가 할 때 공장 류 코드 를 수정 해 야 하 며 개방 - 폐쇄 원칙 에 부합 되 지 않 습 니 다.
예시: 가감 연산 실현
//  
public class Operation {
	
	private double numberA = 0;
	private double numberB = 0;
	private double result = 0;
	
	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 getResult() {
		return result;
	}

}

//   
public class OperationAdd extends Operation {

	public double getResult() {
		return getNumberA() + getNumberB();
	}
}

//   
public class OperationSub extends Operation {

	public double getResult() {
		return getNumberA() - getNumberB();
	}
}
//   
public class OperationFactory {

	public static Operation createOperate(String operate) {
		Operation oper = null;
		switch (operate) {
		case "+":
			oper = new OperationAdd();
			break;
		case "-":
			oper = new OperationSub();
			break;
		default:
			break;
		}
		
		return oper; 
	}
}

전략 모드
서로 다른 알고리즘 (변화 점) 을 밀봉 하여 서로 바 꿀 수 있 도록 합 니 다. 이런 모델 은 알고리즘 의 변 화 를 알고리즘 을 사용 하 는 고객 에 게 영향 을 주지 않 습 니 다.
정책 클래스 를 매개 변수 로 Context 클래스 에 전송 하고 실행 할 때 대응 하 는 알고리즘 을 호출 합 니 다.
예: 백화점 요금 (정상 요금, 할인 요금, 만 감 요금)
//  
public abstract class CashSupper {

	public abstract double acceptCash(double money);
}

//    
public class CashNormal extends CashSupper {

	@Override
	public double acceptCash(double money) {
		// TODO Auto-generated method stub
		return money;
	}
}

//    
public class CashRebate extends CashSupper {

	private double moneyRebate = 1d;
	
	public CashRebate(String moneyRebate) {
		this.moneyRebate = Double.parseDouble(moneyRebate);
	}

	@Override
	public double acceptCash(double money) {
		// TODO Auto-generated method stub
		return money * moneyRebate;
	}
}

//    
public class CashReturn extends CashSupper {

	private double moneyCondition = 0.0d;//    
	private double moneyReturn = 0.0d;//   
	
	public CashReturn(String moneyCondition, String moneyReturn) {
		this.moneyCondition = Double.parseDouble(moneyCondition);
		this.moneyReturn = Double.parseDouble(moneyReturn);
	}

	@Override
	public double acceptCash(double money) {
		// TODO Auto-generated method stub
		if(money >= moneyCondition) {
			return money - Math.floor(money / moneyCondition) * moneyReturn;
		}else {
			return money;
		}
	}
}
public class CashContext{

	private CashSupper cashSupper;

	public CashContext(CashSupper cs){
		this.cashSupper = cs;
	}

	public double getResult(double money){
		return cashSupper.acceptCash(money);
	}
}

클 라 이언 트 코드:
CashContext cashContext = null;

switch(type){
	case "    ":
		cashContext = new CashContext(new CashNormal());
		break;
	case "   ":
		cashContext = new CashContext(new CashRebate("0.8"));
		break;
	case " 300 100":
		cashContext = new CashContext(new CashReturn("300","100"));
		break;
}
//       
cashContext.getResult(money);

클 라 이언 트 가 어떤 알고리즘 을 사용 하 는 지 판단 하지 않도록 공장 모델 을 결합 시 킬 수 있다.
//    CashContext
public class CashContext {

	private CashSupper cashSupper;

	public CashContext(String type) {
		switch (type) {
		case "    ":
			cashSupper = new CashNormal();
			break;
		case "   ":
			cashSupper = new CashRebate("0.8");
			break;
		case " 300 100":
			cashSupper = new CashReturn("300", "100");
		default:
			break;
		}
	}
	
	public double getResult(double money) {
		return cashSupper.acceptCash(money);
	}
}

CashContext 클래스 를 수정 하고 변 경 된 클 라 이언 트 코드 만 필요 합 니 다.
public static void main(String[] args) {
		// TODO Auto-generated method stub

		String type = " 300 100";
		double money = 900d;
		CashContext cashContext = new CashContext(type);
		System.out.println(cashContext.getResult(money));
}

좋은 웹페이지 즐겨찾기