값 객체를 참조 객체로 변경(Change Value to Reference)

3551 단어

Summary:


너는 하나의 종류에서 서로 같은 많은 실례를 파생시켜 그것들을 같은 대상으로 바꾸기를 바란다.이 값의 대상을 인용 대상으로 만듭니다.

Motivation:


많은 시스템에서 대상에 대해 유용한 분류를 할 수 있다. 인용 대상과 값 대상이다.전자는'고객','계좌'와 같은 물건으로 모든 대상이 실제 세계의 실물을 대표하고 두 대상이 동일한지 직접 같은 조작부호(==)로 검사할 수 있다.후자는'날짜','돈'과 같은 것이다. 그것들은 완전히 그 안에 포함된 데이터 값에 의해 정의된다. 당신은 복사본의 존재를 개의치 않는다. 시스템에'1/1/2000'이라는 내용의'날짜'대상이 수백 수천 개 존재할 수도 있다.물론 두 값의 대상이 같은지 알아야 하기 때문에 equals () (그리고hashCode ()) 를 덮어써야 한다.
인용 대상과 값 대상 사이의 선택을 하는 것은 때때로 쉽지 않다.때때로, 당신은 간단한 값 대상에서 시작하여 수정할 수 없는 소량의 데이터를 저장할 수 있다.이후에 이 대상에 수정 가능한 데이터를 추가하고 그 어떠한 대상에 대한 수정도 이 대상을 인용하는 모든 곳에 영향을 미칠 수 있도록 할 수 있습니다.이럴 때는 이 대상을 인용 대상으로 만들어야 한다.

Mechanics:


1. Replace Constructor with Factory Method 사용
2. 컴파일, 테스트.
3. 어떤 대상이 새로운 대상을 방문하는 경로를 제공하는지 결정한다.
정적 사전이나 등록표 대상일 수도 있습니다.여러 객체를 새 객체에 대한 액세스 포인트로 사용할 수도 있습니다.
4. 인용 대상을 미리 만들거나 동적으로 만들어야 한다고 결정합니다.
만약 이 인용 대상이 미리 만들어진 것이고, 메모리에서 그것을 읽어내야 한다면, 필요할 때 불러올 수 있도록 확보해야 한다.
5. 공장 함수를 수정하여 인용 대상을 되돌려줍니다.
만약 대상이 사전에 만들어진 것이라면, 만약 누군가가 실제로 존재하지 않는 대상을 요구한다면, 어떻게 오류를 처리해야 합니까?
공장 함수에 Rename Method를 사용해서 이 정보를 전달하기를 원할 수도 있습니다. 이것은 저장된 대상을 되돌려줍니다.
6. 컴파일, 테스트.

예제


Replace Data Value with Object에서 이 예부터 재구성된 프로그램을 만들었습니다.
마지막 재구성(Replace Data Value with Object)이 끝나면 Customer 객체는 값 객체입니다.여러 주문이 동일한 고객에 속해도 각 Order 객체는 각각의 Customer 객체를 가지고 있습니다.우리는 이러한 현상을 바꾸어 한 고객이 여러 개의 다른 주문서를 가지고 있으면 이 주문서를 대표하는 Order 대상이 같은 Customer 대상을 공유할 수 있도록 하기를 희망한다.즉, 각 고객 이름은 하나의 Customer 객체에만 해당됩니다.
먼저 ReplaceConstructor with Factory Method를 사용합니다.이렇게 하면 Customer 객체의 작성 프로세스를 제어할 수 있으므로 나중에 매우 중요합니다.Customer 클래스에서 이 플랜트 함수를 정의합니다.
4
public class Customer
{
    public static Customer create( String name )
    {
        return new Customer( name );
    }
}
그리고 원래 구조 함수를 호출한 곳을 공장 함수로 수정한다.
public Order( String customerName )
{
    customer = Customer.create( customerName );
}

그리고 구조 함수를private:
private Customer( String name )
{
    this.name = name;
}

이제 Customer 객체에 액세스하는 방법을 결정해야 합니다.다른 객체(예: Order의 한 필드)에서 액세스하여 물어볼 수 있습니다.그러나 이 예에서는 Customer 객체에 액세스할 수 있는 뚜렷한 필드가 없습니다.이 경우 모든 Customer 객체를 액세스 포인트로 저장하는 레지스트리 객체를 만들 수 있습니다.예를 단순화하기 위해 이 레지스트리는 Customer 클래스의 static 필드에 저장하고 Customer 클래스를 액세스 포인트로 합니다.
private static Dictionary instances = new Hashtable();

그런 다음 요청을 받을 때 새 Customer 객체를 작성해야 할지 아니면 미리 작성해야 할지 결정해야 합니다.여기서 우리는 후자를 선택한다.응용 프로그램의 시작 코드에서 먼저 필요한 Customer 객체를 제대로 로드합니다.이 대상들은 데이터베이스에서 왔을 수도 있고 파일에서 왔을 수도 있다.간단하게 보기 위해서, 우리는 코드에서 이러한 대상을 명확하게 생성한다.나중에 필요한 경우 Substitute Algorithem을 사용하여 작성 방법을 변경할 수 있습니다.
static void loadCustomers()
{
   new Customer( "Lemon Car Hire" ).store();
   new Customer( "Associated Coffee Machines" ).store();
   new Customer( "Bilston Gasworks" ).store();
}

private void store()
{
    instances.put( this.getName(), this );
}

플랜트 함수를 수정하여 미리 작성된 Customer 객체를 반환합니다.
public static Customer create( String name )
{
    return ( Customer ) instances.get( name );
}

create () 는 항상 기존의 Customer 대상을 되돌려주기 때문에, 이 점을 강조하기 위해 Rename Method를 사용하여 이 공장 함수의 이름을 수정해야 합니다
public static Customer getNamedCustomer( String name )
 {
     return ( Customer ) instances.get( name );
}

좋은 웹페이지 즐겨찾기