-
템플릿 메소드 패턴
부모클래스에 기본적인 공통의 로직을 만들고 다르게 사용하여하는 메소드를 추상화하여 서브클래스에서 구현하여 사용하는 방법이다.
public abstract class VendingMachine { public void process() { this.insertCoin(); this.makeProduct(); this.returnProduct(); this.returnCoin(); } protected abstract void makeProduct(); private void insertCoin() { System.out.println("돈을 받았습니다."); } private void returnProduct() { System.out.println("상품을 반환합니다"); } private void returnCoin() { System.out.println("잔돈을 건네줍니다."); } }
public class CoffeeVendingMachine extends VendingMachine { @Override protected void makeProduct() { System.out.println("커피를 만듭니다."); } }
public class CokeVendingMachine extends VendingMachine { @Override protected void makeProduct() { System.out.println("콜라를 만듭니다"); } }
public class Main { public static void main(String[] args) { VendingMachine coffeeVendingMachine = new CoffeeVendingMachine(); VendingMachine cokeVendingMachine = new CokeVendingMachine(); coffeeVendingMachine.process(); cokeVendingMachine.process(); } }
팩토리 메소드 패턴
팩토리 클래스를 생성하여 객체 생성을 팩토리 클래스에게 위임한다.
public class VendingMachineFactory { public static VendingMachine create(MachineType machineType) { switch (machineType) { case Coke: { return new CokeVendingMachine(); } case Coffee: { return new CoffeeVendingMachine(); } } throw new IllegalArgumentException(); } public enum MachineType { Coke, Coffee } }
public class Main { public static void main(String[] args) { VendingMachineFactory.create(VendingMachineFactory.MachineType.Coffee).process(); VendingMachineFactory.create(VendingMachineFactory.MachineType.Coke).process(); } }