매일 하나의 디자인 모델 (4) - 건설 자 모델

17362 단어 디자인 모드
무슨 소 용이 있 느 냐
소프트웨어 개발 에서 이러한 상황 을 만 날 수 있다. 한 가지 내부 데이터 가 너무 복잡 하고 많은 구성원 속성 을 가진다. 이런 구성원 속성 중 에는 인용 유형의 구성원 대상 이 있다.이러한 인 스 턴 스 를 만 들 때 일부 속성의 할당 은 특정한 순서 로 해 야 합 니 다. 하나의 속성 이 할당 되 지 않 기 전에 다른 속성 은 할당 할 수 없 을 수도 있 습 니 다.우리 가 이런 상황 을 만 났 을 때 정말 고통 이 었 다. 우 리 는 그것 만 을 사용 하고 싶 었 지만, 우 리 는 그것 의 내부 구조 와 어떻게 조립 하 는 지 알 아 보 는 데 시간 을 들 여야 했다.이때 건설 자 모델 은 우리 가 고통 을 줄 이 는 데 도움 을 줄 수 있다.
가설 장면: 조립 시스템 은 사용자 가 부품 을 합 격 된 데스크 톱 으로 조립 하 는 데 도움 을 줄 수 있다. 이 는 구체 적 인 조립 과정 을 건설 자 라 는 대상 에 밀봉 하고 건설 자 는 사용자 에 게 이미 조립 한 완전한 제품 대상 에 게 돌려 주 며 사용 자 는 이 대상 이 포함 하 는 속성 과 그들의 생 성 방식 에 관심 을 가지 지 않 고 직접 사용 할 수 있다.
추상 적 인 공장 모델 을 자동차 부품 생산 공장 으로 보고 한 제품 족의 제품 을 생산 한다 면 건설 자 모델 은 바로 자동차 조립 공장 으로 부품 에 대한 조립 을 통 해 완전한 자동 차 를 되 돌 릴 수 있다.
패턴 구조
  • 지휘 자 는 사용자 와 소통 하고 사용자 가 건설 자 를 선정 한 후에 복잡 한 대상 의 건설 순 서 를 배정 하고 건설 자 대상 의 부품 구조 와 조립 방법 을 호출 하여 복잡 한 대상 의 건설 을 완성 한다.
  • 추상 적 인 건설 자 는 제품 대상 을 만 드 는 각 부품 에 추상 적 인 인 인 터 페 이 스 를 지정 하고 제품 으로 돌아 가 는 방법 을 제공한다.
  • 구체 적 인 건설 자 는 추상 적 인 건설 자 인 터 페 이 스 를 실현 하고 각 부품 의 구조 와 조립 방법 을 실현 하 며 그 가 만 든 복잡 한 대상 을 정의 하고 명 확 히 한다.
  • 구체 적 인 제품 의 창설 목 표 는 구체 적 인 건설 자가 창설 하고 지휘자 가 사용자 에 게 전달한다.

  • 장단 점
    장점.
  • 제품 의 구축 과 업 무 를 분리 시 키 고 사용 자 는 복잡 한 대상 의 내부 구조 와 어떻게 만 드 는 지 에 관심 을 가지 지 않 으 며 사용 자 는 복잡 한 대상 의 유형 과 내용 만 지정 하면 구축 할 수 있다.
  • 모든 구체 적 인 건설 자 는 상대 적 으로 독립 되 어 편리 하 게 교체 하고 증가 할 수 있 으 며 사용자 가 서로 다른 건설 자 를 사용 하면 서로 다른 제품 대상 을 얻 을 수 있다.
  • 시스템 의 확장 이 편리 하고 지휘자 류 는 추상 적 인 건설 자 류 를 대상 으로 프로 그래 밍 한 것 으로 새로운 구체 적 인 건설 자 를 추가 할 때 기 존의 코드 를 수정 하지 않 아 도 되 고 개폐 원칙 에 부합된다.

  • 결점.
  • 제품 간 공통점 이 많아 야 적용 되 며, 차별 성 이 큰 제품 에는 적합 하지 않다
  • 적용 상황
  • 제품 대상 의 내부 데이터 가 복잡 하 다
  • 제품 대상 의 속성 이 서로 의존 되 고 일정한 생 성 순서 가 있다
  • 같은 생 성 과정 에서 서로 다른 제품 대상 을 생 성 할 수 있다.이 모델 에 지휘자 류 를 도입 하여 생 성 과정 을 지휘자 류 에 밀봉 하고 건설 자 류 에 있 지 않 기 때문에 구체 적 인 건설 자 를 교체 하면 서로 다른 제품 대상 을 만 들 수 있다.

  • 실제 응용
  • Android AlertDialog 클래스
  • Java StringBuilder 의 append
  • 코드 예제
    https://github.com/zero4eva/design_pattern
  • ComputerTest.java
    public class ComputerTest {
        public static void main(String[] args) {
            ComputerBuilder builder = new HighComputerBuilder();
            ComputerDirector director = new ComputerDirector();
            director.setBuilder(builder);
            Computer computer = director.Construct();
            System.out.println(computer.toString());
        }
    }
    
  • Computer.java
    public class Computer {
        private String mainBoard;
        private String CPU;
        private String hardDisk;
        private String GPU;
        private String RAM;
        private String display;
        private String chassis;
        // setter getter toString
        ...
    }
    
  • ComputerBuilder.java
    public abstract class ComputerBuilder {
    
        protected Computer computer;
    
        public ComputerBuilder() {
    
            this.computer = new Computer();
        }
    
        public abstract void buildMainBoard();
    
        public abstract void buildCPU();
    
        public abstract void buildHardDisk();
    
        public abstract void buildGPU();
    
        public abstract void buildRAM();
    
        public abstract void buildDisplay();
    
        public abstract void buildChassis();
    
        public Computer getComputer() {
            return this.computer;
        }
    }
    
  • ComputerDirector.java
    public class ComputerDirector {
    
        private ComputerBuilder builder;
    
        public ComputerDirector(ComputerBuilder builder) {
            this.builder = builder;
        }
    
        public Computer Construct() {
            builder.buildMainBoard();
            builder.buildCPU();
            builder.buildHardDisk();
            builder.buildGPU();
            builder.buildRAM();
            builder.buildDisplay();
            builder.buildChassis();
            return builder.getComputer();
        }
    }
    
  • HighComputerBuilder.java
    public class HighComputerBuilder extends ComputerBuilder {
    
        @Override
        public void buildMainBoard() {
            super.computer.setMainBoard("m-ATX");
        }
    
        @Override
        public void buildCPU() {
            super.computer.setCPU("Core i9-9900K");
        }
    
        @Override
        public void buildHardDisk() {
            super.computer.setHardDisk("512G SSD + 2TB HDD");
        }
    
        @Override
        public void buildGPU() {
            super.computer.setGPU("RTX 2080 Ti 11G");
        }
    
        @Override
        public void buildRAM() {
            super.computer.setRAM("DDR4 32G");
        }
    
        @Override
        public void buildDisplay() {
            super.computer.setDisplay("ASUS PG27 4K/144HZ");
        }
    
        @Override
        public void buildChassis() {
            super.computer.setChassis("   -244");
        }
    }
    
  • 좋은 웹페이지 즐겨찾기