디자인 모델 - 공장 모델, 이 한 편 만 봐 도 돼.

원본 링크:https://www.jianshu.com/p/83ef48ce635b
최근 에 회사 의 업무 수요 에 따라 평소에 개발 할 때 기본적으로 사용 하 는 기초 업무 모듈 을 봉인 했다. 그 중에서 가장 많이 사용 하 는 것 은 각 공장 모델 이 고 이 기 회 를 틈 타 공장 모델 도 복습 했다.이 글 은 각 공장 모델 의 장단 점 을 상세 하 게 소개 할 것 이다. 만약 당신 이 다음 과 같은 세 가지 사례 를 완전히 이해 할 수 있다 면 공장 모델 은 말 할 것 도 없다.업무 코드 가 공개 되 지 않 기 때문에 글 에 사 용 된 인 스 턴 스 는 다른 예 로 대 체 됩 니 다.우 리 는 자바 안에 모두 23 가지 디자인 모델 이 있 고 공장 모델 은 세 가지 가 있다 는 것 을 알 고 있다. 그들 은 간단 한 공장 모델 (23 가지 모델 에 있 지 않다), 공장 방법 모델 과 추상 적 인 공장 모델 이다. 그 중에서 우리 가 흔히 말 하 는 공장 모델 은 공장 방법 모델 을 말 하 는데 공장 방법 모델 은 일상적인 개발 에서 사용 빈도 가 가장 높 은 디자인 모델 이다.심지어 안 드 로 이 드 의 소스 코드 에서 도 쉽게 볼 수 있다.다음은 학습 의 난이도 에 따라 얕 은 것 에서 깊 은 것 으로 말하자면 이 세 가지 모델 은 모든 모델 이 먼저 정의, 장면 사용, 실례 세 가지 측면 에서 착수한다.많은 어린이 들 이 공 부 를 할 때 이 해 를 느 꼈 고 사례 도 알 아 볼 수 있 지만 실제 개발 에서 활용 하지 않 을 것 이 라 고 말 합 니 다. 이것 은 그의 사용 장면 을 기억 하지 못 하기 때 문 입 니 다. 여러분 의 어린이 들 은 반드시 사례 와 결합 하여 사용 장면 을 기억 해 야 개발 에서 융합 되 고 관통 되 는 효 과 를 얻 을 수 있 습 니 다.이것 은 디자인 모델 이 사상 일 뿐 고정된 코드 가 없다 는 것 을 설명 한다!우선 가장 쉬 운 것 을 보 자.
단순 공장 모드
간단 한 공장 모델 은 디자인 모델 이 아니 라 프로 그래 밍 습관 이다.
정의: 공장 클래스 를 정의 합 니 다. 들 어 오 는 매개 변수 에 따라 다른 인 스 턴 스 를 되 돌려 줍 니 다. 만 든 인 스 턴 스 는 공 통 된 부모 클래스 나 인 터 페 이 스 를 가지 고 있 습 니 다.
적용 장면: 사실은 정의 에 의 해 그 사용 장면 을 추측 할 수 있 습 니 다. 먼저 한 공장 류 만 있 기 때문에 공장 류 에서 만 든 대상 이 너무 많 으 면 안 됩 니 다. 그렇지 않 으 면 공장 류 의 업무 논리 가 너무 복잡 합 니 다. 그 다음 에 공장 류 가 대상 의 설립 과정 을 밀봉 하기 때문에 클 라 이언 트 는 대상 의 설립 에 관심 을 가지 지 않 아야 합 니 다.적용 장면 을 정리 해 보 자. (1) 만들어 야 할 대상 이 비교적 적다.(2) 클 라 이언 트 가 대상 의 생 성 과정 에 관심 이 없다.이상 은 간단 한 공장 모델, 간단 한 공장 모델 의 적용 장면 입 니 다. 다음은 구체 적 인 사례 를 보 겠 습 니 다.
인 스 턴 스: 서로 다른 모양 을 그 릴 수 있 는 그림 그리 기 도 구 를 만 듭 니 다. 원형, 정사각형, 삼각형 을 그 릴 수 있 습 니 다. 모든 그림 은 draw () 방법 으로 그림 을 그 릴 수 있 습 니 다. 코드 를 보지 않 고 이 모델 디자인 을 통 해 이 기능 을 완성 하 는 방법 을 먼저 고려 하 십시오.
문제 에서 알 수 있 듯 이 원형, 정사각형, 삼각형 은 모두 하나의 도형 에 속 하고 draw 방법 을 가지 기 때문에 먼저 인터페이스 나 추상 류 를 정의 할 수 있다. 이 세 이미지 의 공공 부류 로 서 그 중에서 공공 draw 방법 을 설명 할 수 있다.
public interface Shape {
    void draw();
}

여기 서 추상 류 로 정의 하 는 것 도 가능 하 다. 인 터 페 이 스 는 더욱 높 은 추상 일 뿐 이 므 로 습관 적 으로 인터페이스 로 정의 하고 인 터 페 이 스 는 여러 가지 실현 을 지원 하 며 나중에 확장 하기에 편리 하 다.
다음은 구체 적 인 도형 을 작성 하 는 것 입 니 다. 모든 도형 은 Shape 인터페이스 원형 을 실현 합 니 다.
public class CircleShape implements Shape {

    public CircleShape() {
        System.out.println(  "CircleShape: created");
    }

    @Override
    public void draw() {
        System.out.println(  "draw: CircleShape");
    }

}

정사각형
public class RectShape implements Shape {
    public RectShape() {
       System.out.println(  "RectShape: created");
    }

    @Override
    public void draw() {
       System.out.println(  "draw: RectShape");
    }

}

삼각형
public class TriangleShape implements Shape {

    public TriangleShape() {
        System.out.println(  "TriangleShape: created");
    }

    @Override
    public void draw() {
        System.out.println(  "draw: TriangleShape");
    }

}

다음은 공장 류 의 구체 적 인 실현 이다.
 public class ShapeFactory {
          public static final String TAG = "ShapeFactory";
          public static Shape getShape(String type) {
              Shape shape = null;
              if (type.equalsIgnoreCase("circle")) {
                  shape = new CircleShape();
              } else if (type.equalsIgnoreCase("rect")) {
                  shape = new RectShape();
              } else if (type.equalsIgnoreCase("triangle")) {
                  shape = new TriangleShape();
              }
              return shape;
          }
   }

이 공장 류 에서 서로 다른 type 을 통 해 new 의 다른 모양 을 전달 할 수 있 고 결 과 는 Shape 유형 으로 되 돌아 갈 수 있 습 니 다. 이것 이 바로 간단 한 공장 의 핵심 입 니 다.클 라 이언 트 사용
원형 을 그리다
    Shape shape= ShapeFactory.getShape("circle");
    shape.draw();

정사각형 을 그리다
    Shape shape= ShapeFactory.getShape("rect");
    shape.draw();

삼각형 을 그리다
    Shape shape= ShapeFactory.getShape("triangle");
    shape.draw();

Shape Factory 에 서로 다른 매개 변 수 를 전달 함으로써 다양한 모양 의 그리 기 를 실현 합 니 다.이상 은 간단 한 공장 방식 입 니 다. 젊은이 들 은 알 아 보 셨 습 니까?
공장 방법 모델
공장 방법 모델 은 간단 한 공장 의 심화 이다. 공장 방법 모델 에서 우 리 는 통 일 된 공장 류 를 제공 하여 모든 대상 을 만 들 지 않 고 서로 다른 대상 에 대해 서로 다른 공장 을 제공한다.대상 마다 그 에 대응 하 는 공장 이 있다 는 얘 기다.
정의: 대상 을 만 드 는 데 사용 할 인 터 페 이 스 를 정의 하여 하위 클래스 가 어떤 종 류 를 예화 할 지 결정 합 니 다.공장 방법 모델 은 하나의 사례 화 를 하위 클래스 로 지연 시 켰 다.이번에 우 리 는 먼저 실례 를 들 어 이 정 의 를 상세 하 게 설명 하고 마지막 으로 그것 의 사용 장면 을 정리 하고 있다.
인 스 턴 스: jpg, png, gif 형식의 그림 을 불 러 올 수 있 는 여러 개의 그림 로드 클래스 를 설계 해 야 합 니 다. 모든 로드 는 read () 방법 이 있 습 니 다. 그림 을 읽 을 수 있 습 니 다.다음은 이 그림 로드 클래스 를 완성 합 니 다.
먼저 이미지 로 더 의 디자인 을 완성 하고 로 더 의 공공 인 터 페 이 스 를 만 듭 니 다.
public interface Reader {
    void read();
}

Reader 에는 read () 방법 이 하나 밖 에 없 으 며, 각 그림 의 로 더 코드 를 완성 합 니 다.
Jpg 이미지 로 더
public class JpgReader implements Reader {
    @Override
    public void read() {
        System.out.print("read jpg");
    }
}

Png 이미지 로 더
public class PngReader implements Reader {
    @Override
    public void read() {
        System.out.print("read png");
    }
}

Gif 이미지 로 더
public class GifReader implements Reader {
    @Override
    public void read() {
        System.out.print("read gif");
    }
}

지금 우 리 는 정의 에 따라 추상 적 인 공장 인터페이스 Reader Factory 를 정의 합 니 다.
public interface ReaderFactory {
    Reader getReader();
}

그 안에 getReader () 방법 이 있 습 니 다. 그 다음 에 우 리 는 위 에서 정 의 된 모든 이미지 로 더 를 공장 류 로 제공 합 니 다. 이런 공장 류 는 Reader Factory 를 실현 합 니 다.
Jpg 캐리어 공장
public class JpgReaderFactory implements ReaderFactory {
    @Override
    public Reader getReader() {
        return new JpgReader();
    }
}

Png 캐리어 공장
public class PngReaderFactory implements ReaderFactory {
    @Override
    public Reader getReader() {
        return new PngReader();
    }
}

Gif 캐리어 공장
public class GifReaderFactory implements ReaderFactory {
    @Override
    public Reader getReader() {
        return new GifReader();
    }
}

모든 공장 클래스 에서 우 리 는 복사 한 getReader () 방법 을 통 해 각자 의 이미지 로 더 대상 을 되 돌려 줍 니 다.
클 라 이언 트 사용
Jpg 읽 기
ReaderFactory factory=new JpgReaderFactory();
Reader  reader=factory.getReader();
reader.read();

Png 읽 기
ReaderFactory factory=new PngReaderFactory();
Reader  reader=factory.getReader();
reader.read();

Gif 읽 기
ReaderFactory factory=new GifReaderFactory();
Reader  reader=factory.getReader();
reader.read();

위의 세 단락 코드 를 볼 수 있 고 서로 다른 형식의 그림 을 읽 었 다. 다른 점 은 서로 다른 그림 형식 에 대해 서로 다른 공장 을 설명 하고 해당 하 는 그림 가 로 더 를 만 들 었 다 는 것 이다.
이 사례 를 통 해 여러분 은 공장 모델 에 대해 진일보 한 이 해 를 가지 게 되 었 습 니까? 간단 한 공장 과 비교 해 보면 가장 근본 적 인 차 이 는 간단 한 공장 은 하나의 통 일 된 공장 류 만 있 고 공장 방법 은 모든 설립 대상 에 게 하나의 공장 류 를 제공 하 는 것 입 니 다. 이런 공장 류 는 모두 하나의 공장 기 류 를 실현 하 는 것 입 니 다 (본 사례 에서 Reader Factory).다음은 공장 방법의 적용 장면 을 요약 한다.
적용 필드:
(1) 클 라 이언 트 는 만 든 대상 의 종 류 를 알 필요 가 없습니다.예 를 들 어 우 리 는 모든 그림 의 로 더 의 구체 적 인 이름 이 무엇 인지 모 르 고 공장 이름 만 알 고 침대 프레임 과정 을 완성 했다.(2) 클 라 이언 트 는 하위 클래스 를 통 해 해당 하 는 대상 을 지정 할 수 있 습 니 다.상기 장면 은 공장 방법 모델 을 사용 하 는 데 사용 된다.
추상 공장 모드
이 모델 은 가장 이해 하기 어렵 고 실제 응용 에서 한계 도 크다. 왜냐하면 이 모델 은 개폐 원칙 에 부합 되 지 않 기 때문이다.실제 개발 은 아직 저울질 을 잘 해 야 한다.추상 적 인 공장 모델 은 공장 방법의 진일보 한 심화 이다. 이 모델 에서 공장 류 는 하나의 대상 을 만 들 수 있 을 뿐만 아니 라 하나의 대상 을 만 들 수 있다.이것 은 공장 방법 과 가장 큰 차이 점 이다.
정의: 일련의 관련 되 거나 서로 의존 하 는 대상 을 만 드 는 인 터 페 이 스 를 제공 합 니 다. 구체 적 인 종 류 를 지정 할 필요 가 없습니다.(추상 적 인 공장 모델 에서 모든 구체 적 인 공장 은 여러 개의 공장 방법 을 제공 하여 다양한 유형의 대상 을 만 드 는 데 사용) 추상 적 인 공장 은 공장 방법 과 마찬가지 로 4 부분 으로 나 눌 수 있다. AbstractFactory (추상 적 인 공장) 는 대상 을 만 드 는 방법 을 밝 혔 고 주 의 는 한 팀 이다.Concrete Factory (구체 적 인 공장): 추상 적 인 공장 에서 성명 한 창설 대상 의 방법 을 실현 하고 구체 적 인 대상 을 생 성 한다.AbstractProduct (추상 제품): 모든 대상 에 게 인 터 페 이 스 를 설명 하고 대상 이 가지 고 있 는 업무 방법 을 설명 합 니 다.Concrete 제품 (구체 적 인 제품): 구체 적 인 공장 생산의 구체 적 인 대상 을 정의 합 니 다.다음은 구체 적 인 실례 를 먼저 보 겠 습 니 다.
인 스 턴 스: 지금 은 크로스 플랫폼 게임 을 해 야 합 니 다. Android, Ios, Wp 세 개의 모 바 일 운영 체 제 를 호 환 해 야 합 니 다. 이 게임 은 모든 시스템 에 대해 조작 컨트롤 러 (OperationController) 와 인터페이스 컨트롤 러 (UIController) 를 설 계 했 습 니 다. 다음은 추출 공장 방식 으로 이 게임 의 구조 설 계 를 완성 하 겠 습 니 다.
문제 에서 알 수 있 듯 이 게임 안의 각 플랫폼 의 UIController 와 OperationController 는 우리 가 최종 적 으로 생산 한 구체 적 인 제품 이 어야 한다.그래서 두 개의 추상 적 인 제품 인 터 페 이 스 를 새로 만 들 었 다.
추상 조작 컨트롤 러
public interface OperationController {
    void control();
}

추상 인터페이스 컨트롤 러
public interface UIController {
    void display();
}

그리고 각 시스템 플랫폼 의 구체 적 인 조작 컨트롤 러 와 인터페이스 컨트롤 러 Android 를 완성 합 니 다.
public class AndroidOperationController implements OperationController {
    @Override
    public void control() {
        System.out.println("AndroidOperationController");
    }
}

public class AndroidUIController implements UIController {
    @Override
    public void display() {
        System.out.println("AndroidInterfaceController");
    }
}

Ios
public class IosOperationController implements OperationController {
    @Override
    public void control() {
        System.out.println("IosOperationController");
    }
}

public class IosUIController implements UIController {
    @Override
    public void display() {
        System.out.println("IosInterfaceController");
    }
}

Wp
public class WpOperationController implements OperationController {
    @Override
    public void control() {
        System.out.println("WpOperationController");
    }
}
public class WpUIController implements UIController {
    @Override
    public void display() {
        System.out.println("WpInterfaceController");
    }
}

다음은 남 은 공장 을 정의 합 니 다. 이 공장 은 OperationController 와 UIController 를 만 들 수 있어 야 합 니 다.
public interface SystemFactory {
    public OperationController createOperationController();
    public UIController createInterfaceController();
}

각 플랫폼 의 구체 적 인 공장 류 에서 조작 컨트롤 러 와 인터페이스 컨트롤 러 의 생 성 과정 을 완성 합 니 다.
Android
public class AndroidFactory implements SystemFactory {
    @Override
    public OperationController createOperationController() {
        return new AndroidOperationController();
    }

    @Override
    public UIController createInterfaceController() {
        return new AndroidUIController();
    }
}

Ios
public class IosFactory implements SystemFactory {
    @Override
    public OperationController createOperationController() {
        return new IosOperationController();
    }

    @Override
    public UIController createInterfaceController() {
        return new IosUIController();
    }
}

Wp
public class WpFactory implements SystemFactory {
    @Override
    public OperationController createOperationController() {
        return new WpOperationController();
    }

    @Override
    public UIController createInterfaceController() {
        return new WpUIController();
    }
}

클 라 이언 트 호출:
    SystemFactory mFactory;
    UIController interfaceController;
    OperationController operationController;

    //Android
    mFactory=new AndroidFactory();
    //Ios
    mFactory=new IosFactory();
    //Wp
    mFactory=new WpFactory();

    interfaceController=mFactory.createInterfaceController();
    operationController=mFactory.createOperationController();
    interfaceController.display();
    operationController.control();

서로 다른 플랫폼 에 대해 서로 다른 공장 대상 을 만 드 는 것 만으로 조작 과 UI 컨트롤 러 를 만 들 었 습 니 다.젊은이 들 은 이 게임 이 공장 방법 모델 로 구축 되 려 면 몇 개의 공장 류 를 만들어 야 하 는 지 비교 해 볼 수 있다.다음은 추상 적 인 공장 의 적용 장면 을 요약 한다.
적용 장면: (1) 공장 방법 과 마찬가지 로 클 라 이언 트 는 만 든 대상 의 종 류 를 알 필요 가 없습니다.(2) 한 그룹의 대상 이 공동으로 어떤 기능 을 완성 해 야 할 때.또한 여러 그룹의 대상 이 서로 다른 기능 을 완성 하 는 경우 가 있 을 수 있다.(3) 시스템 구조 가 안정 적 이 고 대상 을 자주 늘 리 지 않 는 다.(일단 증가 하면 기 존 코드 를 수정 해 야 하기 때문에 개폐 원칙 에 부합 되 지 않 습 니 다)
이상 은 세 가지 공장 모델 의 총 결 입 니 다. 잘못된 점 이 있 으 면 다른 사람 을 오도 하지 않도록 댓 글 을 남 겨 주 십시오.
저자: KnightDavion 링크:https://www.jianshu.com/p/83ef48ce635b 출처: 간 서 간 서 저작권 은 작가 의 소유 이 며, 어떠한 형식의 전재 도 작가 에 게 연락 하여 권한 을 수 여 받 고 출처 를 밝 혀 주 십시오.

좋은 웹페이지 즐겨찾기