빌더 패턴 구현 - 추상 클래스

2858 단어 javaoopdesign

빌더 패턴



빌더 패턴이 필요한 이유를 살펴보겠습니다...

생성자에서 초기화할 N개의 필드가 있는 클래스가 있는 경우 Telescoping Constructor 으로 끝납니다. 텔레스코핑 생성자의 문제는 생성자를 호출하는 동안 전달되는 인수의 순서를 기억하기 어렵다는 것입니다.

빌더 패턴은 복잡한 객체의 구성을 표현에서 분리하려는 객체 생성 디자인 패턴입니다. 그렇게 함으로써 동일한 시공 과정이 다른 표현으로 이어질 수 있습니다.

이 패턴을 디자인하는 방법은 <ClassName>Builder 라는 내부 정적 클래스를 만드는 것입니다. 이 클래스의 메서드는 필드 설정을 허용해야 합니다. 마지막으로 새 객체를 생성하기 위해 빌더 클래스 객체를 인수로 취하는 외부 클래스의 생성자를 차례로 호출하는 build() 메서드가 있습니다.

다음 예제에서는 추상 클래스로 빌더 패턴을 구현하는 방법을 살펴보겠습니다.

public abstract class Animals {

    private int legs;
    private int eyes;
    private int ears;

    //getters //toString

    //Constructor has parameter of type builder 

    public Animals(AnimalBuilder builder) {
        this.legs = builder.legs;
        this.eyes = builder.eyes;
        this.ears = builder.ears;
    }



아래는 Animal Abstract 클래스의 Builder 클래스입니다. 이 예제에서는 내부 클래스이며 build() 메서드는 서브클래스에서 구현해야 하는 추상이어야 합니다.

public abstract static class AnimalBuilder {

        private int legs;
        private int eyes;
        private int ears;

        public AnimalBuilder setLegs(int legs) {
            this.legs = legs;
            return this;
        }

        public AnimalBuilder setEyes(int eyes) {
            this.eyes = eyes;
            return this;
        }

        public AnimalBuilder setEars(int ears) {
            this.ears = ears;
            return this;
        }

        public abstract Animals build();

    }


이제 위의 추상 클래스Animals를 구체적인 클래스Dog로 확장해 보겠습니다.

public class Dog extends Animals{

    private int tail;

    public Dog(DogBuilder builder) {
        super(builder);
        this.tail = builder.tail;
    }

//getters and toString



추상 클래스AnimalBuilder의 내부 추상 클래스Animal를 확장해야 합니다.

public static class DogBuilder extends Animals.AnimalBuilder {


        private int tail;

        public DogBuilder setTail(int tail) {
            this.tail = tail;
            return this;
        }

        @Override
        public Animals build() {
            return new Dog(this);
        }
    }



마지막으로 아래는 드라이버 코드입니다.

참고*: 아래 예제에서는 슈퍼 클래스 메서드 반환 유형이 Animal이므로 개체를 명시적으로 Dog로 다운캐스팅해야 합니다.
제네릭을 사용하면 이를 피할 수 있습니다.

Dog dog = (Dog) new Dog.DogBuilder().setTail(1).setLegs(4).setEars(2).setEyes(2).build();

Output : Dog has 1 tail, 4 legs, 2 ears, 2 eyes

좋은 웹페이지 즐겨찾기