빌더 패턴 구현 - 추상 클래스
빌더 패턴
빌더 패턴이 필요한 이유를 살펴보겠습니다...
생성자에서 초기화할 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
Reference
이 문제에 관하여(빌더 패턴 구현 - 추상 클래스), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/karthikrg/implementing-builder-pattern-abstract-class-3c1l
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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;
}
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();
}
public class Dog extends Animals{
private int tail;
public Dog(DogBuilder builder) {
super(builder);
this.tail = builder.tail;
}
//getters and toString
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);
}
}
Dog dog = (Dog) new Dog.DogBuilder().setTail(1).setLegs(4).setEars(2).setEyes(2).build();
Reference
이 문제에 관하여(빌더 패턴 구현 - 추상 클래스), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/karthikrg/implementing-builder-pattern-abstract-class-3c1l텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)