이를 달성하는 간단한 방법은 속성을 읽을 수있는 인터페이스와 읽기 전용 메서드 및 해당 인터페이스를 구현하는 클래스 만 호출하여 해당 클래스를 작성할 수있는 인터페이스를 갖는 것입니다.
그것을 생성하고 전자를 처리 한 다음 후자를 반환하여 읽기 전용 인터페이스 만 제공합니다. 이를 위해서는 복사가 필요하지 않으며 작성자와 달리 발신자가 사용할 수있는 동작을 쉽게 미세 조정할 수 있습니다.
이 예제를 보자 :
public interface IPerson
{
public String FirstName
{
get;
}
public String LastName
{
get;
}
}
public class PersonImpl : IPerson
{
private String firstName, lastName;
public String FirstName
{
get { return firstName; }
set { firstName = value; }
}
public String LastName
{
get { return lastName; }
set { lastName = value; }
}
}
class Factory
{
public IPerson MakePerson()
{
PersonImpl person = new PersonImpl();
person.FirstName = 'Joe';
person.LastName = 'Schmoe';
return person;
}
}
이 접근법의 유일한 단점은 구현 클래스로 간단히 캐스트 할 수 있다는 것입니다. 보안상의 문제라면이 방법을 사용하는 것만으로는 충분하지 않습니다. 이에 대한 해결 방법은 은 변경 가능 클래스를 랩핑하기 파사드 클래스를 입니다. 이는 호출자가 작업하고 내부 오브젝트에 액세스 할 수없는 인터페이스를 표시합니다.
이런 식으로 캐스팅조차도 도움이되지 않습니다. 둘 다 동일한 읽기 전용 인터페이스에서 파생 될 수 있지만 반환 된 객체를 캐스팅하면 Facade 클래스 만 제공됩니다.이 클래스는 래핑 된 가변 클래스의 기본 상태를 변경하지 않으므로 변경할 수 없습니다.
이것은 불변의 객체가 생성자를 통해 한 번만 구성되는 일반적인 추세를 따르지 않는다는 점을 언급 할 가치가 있습니다. 당연히 많은 매개 변수를 처리해야 할 수도 있지만 이러한 모든 매개 변수를 미리 정의해야하는지 또는 나중에 소개 할 수 있는지 스스로에게 문의해야합니다. 이 경우 필요한 매개 변수 만있는 간단한 생성자를 사용해야합니다. 다시 말해,이 패턴이 프로그램의 다른 문제를 덮고 있다면 사용하지 마십시오.