Một cách đơn giản để đạt được điều này là có một giao diện cho phép một người đọc các thuộc tính và chỉ gọi các phương thức chỉ đọc và một lớp thực hiện giao diện đó cũng cho phép bạn viết lớp đó.
Phương thức của bạn tạo ra nó, giao dịch với cái trước và sau đó trả về cái sau chỉ cung cấp giao diện chỉ đọc để tương tác. Điều này sẽ không yêu cầu sao chép và nó cho phép bạn dễ dàng tinh chỉnh các hành vi bạn muốn có sẵn cho người gọi trái ngược với người tạo.
Lấy ví dụ này:
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;
}
}
Nhược điểm duy nhất của phương pháp này là người ta có thể đơn giản chuyển nó đến lớp thực hiện. Nếu đó là vấn đề bảo mật, thì chỉ cần sử dụng phương pháp này là không đủ. Một cách giải quyết cho vấn đề này là bạn có thể tạo một lớp mặt tiền để bọc lớp có thể thay đổi, chỉ đơn giản là trình bày một giao diện mà người gọi làm việc cùng và không thể có quyền truy cập vào đối tượng bên trong.
Bằng cách này, thậm chí không đúc sẽ giúp bạn. Cả hai đều có thể xuất phát từ cùng một giao diện chỉ đọc, nhưng việc truyền đối tượng được trả về sẽ chỉ cung cấp cho bạn lớp Facade, điều này là bất biến vì nó không thay đổi trạng thái cơ bản của lớp có thể thay đổi được bọc.
Điều đáng nói là điều này không theo xu hướng điển hình trong đó một đối tượng bất biến được xây dựng một lần và mãi mãi thông qua nhà xây dựng của nó. Có thể hiểu được, bạn có thể phải xử lý nhiều tham số, nhưng bạn nên tự hỏi mình nếu tất cả các tham số này cần được xác định trước hoặc nếu một số có thể được giới thiệu sau. Trong trường hợp đó, nên sử dụng một hàm tạo đơn giản với các tham số cần thiết. Nói cách khác, không sử dụng mẫu này nếu nó đang che đậy một vấn đề khác trong chương trình của bạn.