Простим способом досягти цього було б мати інтерфейс, який дозволяє читати властивості та викликати лише методи читання лише та клас, який реалізує цей інтерфейс, який також дозволяє писати цей клас.
Ваш метод, який його створює, має справу з першим, а потім повертає останній, забезпечуючи взаємодію лише з читанням. Це не потребує копіювання, і це дозволяє легко налаштувати поведінку, яку ви хочете отримати для абонента, на відміну від автора.
Візьмемо цей приклад:
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, який є незмінним, оскільки він не змінює базовий стан загорнутого змінного класу.
Варто зазначити, що це не відповідає типовій тенденції, в якій незмінний об’єкт будується раз і назавжди через його конструктор. Зрозуміло, що вам, можливо, доведеться мати справу з багатьма параметрами, але ви повинні запитати себе, чи потрібно вказати всі ці параметри на передній план, чи деякі з них можна ввести пізніше. У цьому випадку слід використовувати простий конструктор із лише необхідними параметрами. Іншими словами, не використовуйте цю схему, якщо вона приховує іншу проблему у вашій програмі.