Cara sederhana untuk mencapai ini adalah dengan memiliki antarmuka yang memungkinkan seseorang untuk membaca properti dan memanggil hanya metode baca saja dan kelas yang mengimplementasikan antarmuka yang juga memungkinkan Anda menulis kelas itu.
Metode Anda yang membuatnya, berurusan dengan yang pertama, dan kemudian mengembalikan yang terakhir hanya menyediakan antarmuka baca saja untuk berinteraksi. Ini tidak memerlukan penyalinan dan memungkinkan Anda untuk dengan mudah menyempurnakan perilaku yang Anda inginkan tersedia bagi penelepon sebagai lawan pencipta.
Ambil contoh ini:
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;
}
}
Satu-satunya kelemahan dari pendekatan ini adalah seseorang dapat dengan mudah melemparkannya ke kelas pelaksana. Jika itu masalah keamanan, maka hanya menggunakan pendekatan ini tidak cukup. Solusi untuk ini adalah bahwa Anda dapat membuat kelas fasad untuk membungkus kelas yang bisa berubah, yang hanya menyajikan antarmuka yang bekerja dengan penelepon dan tidak dapat memiliki akses ke objek internal.
Dengan cara ini, bahkan casting tidak akan membantu Anda. Keduanya dapat berasal dari antarmuka hanya baca yang sama, tetapi casting objek yang dikembalikan hanya akan memberi Anda kelas Fasad, yang tidak berubah karena tidak mengubah keadaan mendasar dari kelas yang dapat diubah yang dibungkus.
Perlu disebutkan bahwa ini tidak mengikuti tren tipikal di mana objek abadi dibangun sekali dan untuk semua melalui konstruktornya. Dapat dimengerti, Anda mungkin harus berurusan dengan banyak parameter, tetapi Anda harus bertanya pada diri sendiri apakah semua parameter ini perlu didefinisikan di muka atau jika beberapa dapat diperkenalkan nanti. Dalam hal itu, konstruktor sederhana dengan hanya parameter yang diperlukan harus digunakan. Dengan kata lain, jangan gunakan pola ini jika menutupi masalah lain di program Anda.