디자인 패턴(2)

이태곤·2023년 10월 24일
0

CS

목록 보기
7/23

1. 팩토리 패턴

  • 상속 관계에 있는 두 클래스에서 상위 클래스에서는 객체 생성을 위한 인터페이스를 정의하고, 하위 클래스가 객체 생성에 대한 구체적인 내용을 구현하는 패턴이다.

  • 장점

    1. 상위 클래스가 객체 생성 방식을 알 필요가 없어지므로 유연성을 갖게 된다.
      → 새로운 객체 생성 방법을 갖는 하위 클래스를 추가하더라도, 상위 클래스는 관여하지 않아도 된다.
    2. 객체 생성 로직은 하위 클래스에서만 구현되므로, 유지보수성이 증가한다.
      → 특정 객체 생성 방식에 대한 수정이 필요한 경우, 해당하는 하위 클래스의 로직만 변경하면 되므로 유지보수성이 증가한다.
enum CoffeeType {
    LATTE,
    ESPRESSO
}

abstract class Coffee {
    protected String name;

    public String getName() {
        return name;
    }
}

class Latte extends Coffee {	//하위 클래스
    public Latte() {
        name = "Latte";
    }
}

class Espresso extends Coffee {	   //하위 클래스
    public Espresso() {
        name = "Espresso";
    }
}

class CoffeeFactory {	//상위 클래스

    public static Coffee createCoffee(CoffeeType type) {
        switch (type) {
            case LATTE:
                return new Latte(); 
            case ESPRESSO:
                return new Espresso();
            default:
                throw new IllegalArgumentException("Invalid coffee type: " + type);
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Coffee coffee = CoffeeFactory.createCoffee(CoffeeType.LATTE);
        System.out.println(coffee.getName()); // 객체의 이름을 출력 (여기서는 "Latte")
    }
}

2. 이터레이터 패턴

  • Iterator를 사용하여 컬렉션을 순회하면서 컬렉션 내의 요소에 접근하기 위한 디자인 패턴이다.
    이터레이터 패턴을 사용하면 다양한 자료구조에 일관된 방식으로 접근할 수 있다.
import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);

        for (Integer item : list) {
            System.out.println(item);
        }
    }
}
  • Java에서 for-each 루프를 통해 컬렉션의 요소에 접근할 수 있는 이유는 Java 컬렉션 클래스가 java.lang.Iterable 인터페이스를 구현한다.
    해당 인터페이스에는 iterator() 메서드가 정의되어 있으며, 이 메서드는 해당 컬렉션의 이터레이터를 반환한다.
    → for-each 루프는 Iterable 인터페이스를 구현한 컬렉션에 대해 작동하며, 내부적으로 컬렉션의 iterator() 메서드를 호출하여 이터레이터를 가져와 컬렉션의 요소를 하나씩 처리한다.

0개의 댓글