Factory Method(Replace Constructor with Factory Method)

4379 단어

Summary: 


대상을 만들 때 단순한 구성 동작만 하는 것이 아니라구조 함수를 공장 함수로 바꾸다.

Motivation: 


이 수법을 사용하는 가장 뚜렷한 동기는 출산류를 파견하는 과정에서 공장 함수로 유형 코드를 대체하는 것이다.형식 코드에 따라 대상을 만들어야 할 수도 있습니다. 현재, 창설 명단에 하위 클래스를 추가해야 합니다. 하위 클래스도 형식 코드에 따라 창설됩니다.그러나 구조 함수는 단일 유형의 대상만 되돌릴 수 있기 때문에 구조 함수를 공장 함수로 바꿔야 한다.
또한 구조 함수의 기능이 수요를 충족시키지 못하면 공장 함수로 대체할 수도 있다.공장 함수도 Change Value to Reference의 기반입니다.공장 함수로 하여금 매개 변수의 개수와 유형에 따라 서로 다른 창설 행위를 선택하게 할 수 있다.

Mechanics:


 1.기존의 구조 함수를 호출할 수 있도록 공장 함수를 새로 만듭니다.
2. 구조 함수를 호출하는 코드를 공장 함수로 변경한다.
3. 매번 교체 후 컴파일 및 테스트
4. 구조 함수를 private로 선언
5. 컴파일

예제 1.정수(실제 유형 코드)를 기준으로 객체 작성


직원 급여 시스템의 경우 "Employee"는 "직원"을 나타냅니다.
class Employee{
    private int type;
    static final int ENGINEER = 0;
    static final int SALESMAN = 1;
    static final int MANAGER = 2;
    Employee(int type){
       this.type = type;
   }
}
Employee에 서로 다른 하위 클래스를 제공하고 각각의 유형 코드를 제공하기를 희망합니다.따라서 플랜트 함수를 설정해야 합니다.
static Employee create(int type){
   return new Employee(type);
}

다음에 구조 함수의 모든 호출점을 수정하여 상기 새로 만든 공장 함수로 바꾸고 구조 함수를private로 성명합니다.
client code:
Employee eng = Employee.create(Employee.ENGINEER);
class Employee{
    ...
    private Employee(int type){
        this.type = type;
    }
}

샘플 2 문자열에 따라 하위 클래스 대상 만들기


지금까지 우리는 실질적인 수확을 얻지 못했다.현재의 장점은 '대상 창설 요청의 수신자' 와 '창설 대상이 속한 클래스' 가 분리된다는 것이다.그런 다음 Replace Type Code with Subclasses를 사용하여 유형 코드를 Employee의 하위 클래스로 변환하면 수업에서는 공장 함수를 사용하여 이러한 하위 클래스를 사용자에게 숨길 수 있습니다.
static Employee create(int type){
   switch(type){
     case ENGINEER:
        return new Engineer();
     case SALESMAN:
        return new Salesman();
     case MANAGER:
        return new Manager();
     default:
        throw new IllegalArgumentException("Incorrect type code value");
   }
}
아쉽게도 이 안에 switch 문구가 하나 있다.만약 우리가 새로운 하위 클래스를 추가한다면, 이곳의 switch 문장을 업데이트하는 것을 기억해야 한다.
이 switch 문장을 도는 좋은 방법은Class를 사용하는 것이다.forName().첫 번째로 해야 할 일은 근본적으로 Rename Method의 변형인 매개변수 유형을 수정하는 것입니다.먼저 문자열 매개변수를 수신할 함수를 만들어야 합니다.
static Employee create(String name){
   try{
       return (Employee)Class.forName(name).newInstance();
    }catch(Exception e){
       throw new IllegalArgumentException("Unable to instantiate " + name);
   }
}
그리고 조금 전에 "create () 함수 int 버전"에서 새 "create () 함수 String 버전"을 호출합니다.
static Employee create(int type){
   switch(type){
     case ENGINEER:
        return create("Engineer");
     case SALESMAN:
        return create("Salesman");
     case MANAGER:
        return create("Manager");
     default:
        throw new IllegalArgumentException("Incorrect type code value");
   }
}

그런 다음 create() 함수의 호출자를 수정하여 다음과 같은 문을 사용합니다.
Employee.create(ENGINEER)

다음으로 수정:
Employee.create("Engineer");

완성되면 "create () 함수 int 버전"을 제거할 수 있습니다.
이제 새 Employee 하위 클래스를 추가해야 할 때create () 함수를 업데이트할 필요가 없습니다.그러나 이로 인해 컴파일러 검사를 잃어 작은 맞춤법 오류가 실행기 오류를 초래할 수 있다.운행 기간 오류를 방지하려면 명확한 함수를 사용하여 대상을 만들 수 있습니다.그러나 이렇게 되면 새로운 하위 클래스가 추가되지 않으면 반드시 새로운 함수를 추가해야 한다.이것이 바로 유형 안전을 위해 희생된 유연성이다.
다른 하나는 Class를 신중하게 사용해야 합니다.forName () 의 이유는 사용자가 하위 클래스 이름을 노출한 것처럼 보이기 때문입니다.

범례 3 명확한 함수로 하위 클래스 만들기


우리는 명확한 함수를 사용하는 다른 경로를 통해 하위 클래스를 숨길 수 있다.만약 소수의 몇 개의 자류만 있고 그것들이 더 이상 변하지 않는다면, 이 방법은 매우 유용하다.추상적인 Person 클래스가 있는데, 그것은 두 개의 하위 클래스가 있는데 그것이 바로 Male과 Female이다.먼저 하이퍼클래스에서 각 하위 클래스에 대한 플랜트 함수를 정의합니다.
class Person{
  ...
  static Person createMale(){
      return new Male();
  }
  static Person createFemale(){
      return new Female();
  }
}

그리고 우리는 아래의 호출을 할 수 있다.
Person kent = new Male();

다음으로 바꾸기:
Person kent = Person.createMale();

그러나 이 때문에 초류는 반드시 자류를 알아야 한다.이런 상황을 피하려면 Product Trader 모드와 같은 좀 더 복잡한 디자인이 필요하다.

좋은 웹페이지 즐겨찾기