POOPOO: 배변 일기 앱
SMALL
생성패턴 목록
- 팩토리 메소드 패턴 (Factory Method Pattern)
- 추상 팩토리 패턴 (Abstract Factory Pattern)
- 싱글톤 패턴 (Singleton Pattern)
- 프로토타입 패턴 (Prototype Pattern)
- 빌더 패턴 (Builder Pattern)
- 오브젝트 풀 패턴 (Object Pool Pattern)
앞에서 배운 팩토리 메소드 패턴을 여러개를 동시에 사용해야 하는 경우에는 추상 팩토리 패턴을 사용하면 새로운 팩토리(추가기능)가 생기더라도 기존에 구현해 놓은 코드에 영향을 주지 않을 수 있고, 새로운 팩토리를 사용하는 클래스에서도 기존 방식과 동일하게 팩토리를 생성하여 사용할 수 있다.
장점
- 클라이언트 코드를 구현클래스에서 분리합니다.
- 객체 패밀리의 교환을 용이하게 합니다.
- 객체의 일관성을 향상시킵니다.
사용시기
- 시스템이 객체의 생성, 구성 및 표현방법과 독립적이어야 하는 경우
- 관련 객체 패밀리를 함께 사용해야하는 경우(필수)
- 구현을 표시하지 않고 인터페이스 만 표시하는 오브젝트 라이브러리를 제공하려는 경우
- 시스템을 여러객체의 패밀리 중 하나로 구성해야하는 경우
UML
은행, 대출종류, 할부개월을 입력하여 매달 갚을 금액을 알아보기 위한 UML 입니다.
- Bank : 은행
- Loan : 대출
- InterestRate : 이자율
- EMI : 지불해야할 대출금액
- years : 할부기간 (년)
Abstract Model Class : AbstractFactory, Bank, Loan
public abstract class AbstractFactory{
public abstract Bank getBank(String bank);
public abstract Loan getLoan(String loan);
}
public interface Bank{
String getBankName();
}
public abstract class Loan{
protected double rate;
abstract void getInterestRate(double rate);
public void calculateLoanPayment(double loanamount, int years){
double EMI;
int n;
n=years*12;
rate=rate/1200;
EMI=((rate*Math.pow((1+rate),n))/((Math.pow((1+rate),n))-1))*loanamount;
System.out.println("your monthly EMI is "+ EMI +" for the amount"+loanamount+" you have borrowed");
}
}
Extends Model Class
1) AbstractFactory : BankFactory, LoanFactory
public class BankFactory extends AbstractFactory{
public Bank getBank(String bank){
if(bank == null){
return null;
}
if(bank.equalsIgnoreCase("KOOKMIN")){
return new KOOKMIN();
}
else if(bank.equalsIgnoreCase("WOORI")){
return new WOORI();
}
else if(bank.equalsIgnoreCase("SHINHAN")){
return new SHINHAN();
}
else if(bank.equalsIgnoreCase("HANA")){
return new HANA();
}
return null;
}
public Loan getLoan(String loan) {
return null;
}
}
public class LoanFactory extends AbstractFactory{
public Bank getBank(String bank){
return null;
}
public Loan getLoan(String loan) {
if(loan == null){
return null;
}
if(loan.equalsIgnoreCase("Home")){
return new HomeLoan();
}
else if(loan.equalsIgnoreCase("Business")){
return new BussinessLoan();
}
else if(loan.equalsIgnoreCase("Education")){
return new EducationLoan();
}
return null;
}
}
2) Bank : KOOKMIN, WOORI, SHINHAN, HANA
public class KOOKMIN implements Bank{
private final String BNAME;
public KOOMIN(){
BNAME="KOOKMIN BANK"
}
public String getBankName(){
return BNAME;
}
}
public class WOORI implements Bank{
private final String BNAME;
public WOORI(){
BNAME="WOORI BANK"
}
public String getBankName(){
return BNAME;
}
}
public class SHINHAN implements Bank{
private final String BNAME;
public SHINHAN(){
BNAME="SHINHAN BANK"
}
public String getBankName(){
return BNAME;
}
}
public class HANA implements Bank{
private final String BNAME;
public HANA(){
BNAME="HANA BANK"
}
public String getBankName(){
return BNAME;
}
}
3) Loan : HomeLoan, BusinessLoan, EducationLoan
public class HomeLoan extends Loan{
public void getInterestRate(double r){
rate=r;
}
}
public class BusinessLoan extends Loan{
public void getInterestRate(double r){
rate=r;
}
}
public class EducationLoan extends Loan{
public void getInterestRate(double r){
rate=r;
}
}
Operation Class : FactoryCreator, AbstractFactoryPatternExample
public class FactoryCreator{
public static AbstractFactory getFactory(String choice){
if(choice.equalsIgnoreCase("Bank")){
return new BankFactory();
}
else if(choice.equalsIgnoreCase("Loan")){
return new LoanFactory();
}
return null;
}
}
public class AbstractFactoryPatternExample {
public static void main(String[] args){
AbstractFactory bankFactory = FactoryCreator.getFactory("Bank");
Bank bank = bankFactory.getBank("KOOKMIN");
AbstractFactory loanFactory = FactoryCreator.getFactory("Loan");
Loan loan = loanFactory.getLoan("Home");
loan.getInterestRate("5");
double loanAmount = 5000000;
int years = 20;
loan.calculateLoanPayment(loanAmount,years);
}
}
출처 : https://www.javatpoint.com/
LIST