После некоторых размышлений я пришел к тому, что я считаю лучшим решением, благодаря некоторому вдохновению от Шаблоны проектирования: элементы многоразового объектно-ориентированного программного обеспечения (Эрих Гамма, Ричард Хелм,Ральф Джонсон и Джон Влиссидес).
Теперь у меня есть два абстрактных класса:
MailingListRecipient - определяет интерфейс для объектов, которые будут представлять получателя списка рассылки.Весь клиентский код будет написан для этого интерфейса, и ему все равно, какой дочерний класс этого абстрактного кода его реализует.У него будут методы для установки имени, фамилии и адреса электронной почты, а также для добавления, обновления, удаления и поиска получателя в списке рассылки.
MailingListMessage - определяет интерфейс для объектов, которые будутпредставляет сообщение в списке рассылки, и в нем будут определены некоторые методы установки и определены некоторые действия.Опять же, клиентский код будет написан для этого интерфейса, и ему будет все равно, как его реализует подкласс.
Тогда у меня будет абстрактный класс фабрики:
MailingListFactory - это создает объекты MailingListRecipient и MailingListMessage по всему клиентскому коду.
Итак, для реальной реализации я создам:
MailChimpRecipient - для представления получателя в списке MailChimp.Приведенный здесь код будет соответствовать интерфейсу, определенному MailingListRecipient , а объекту потребуется ключ API и ListId в его конструкторе.
MailChimpMessage - для представления сообщенияв списке MailChimp.Код здесь будет соответствовать интерфейсу, определенному MailingListMessage , и этому объекту также потребуется ключ API и ListId в его конструкторе.
Мой клиентский код не будет взаимодействовать ни с одним из двухобъекты выше.Вместо этого в одном из моих файлов настроек я создам объект:
MailChimpFactory - используется для создания получателей и сообщений MailChimp.Для объекта потребуются ключ API и ListId, и он, в свою очередь, передаст их конструкторам двух вышеупомянутых классов для создания конкретных объектов MailChimp.
Итак, в своем коде настроек я создам фабрикуобъект:
$mailingListFactory = new MailChimpFactory($apiKey, $listId);
Затем в коде моего клиента будут создаваться новые Получатели и Сообщения, таким образом:
$recipient = $mailingListFactory->createMailingListRecipient();
С этого момента он сможет устанавливать вещи и выполнять действия.:
$recipient->setForename('Lewis');
$recipient->setEmailAddress('lewis@example.com');
$recipient->add();
Если MailChimp внезапно остановит свою службу или я решу использовать другого поставщика списков рассылки, я просто создам новые дочерние классы MailingListRecipient и MailingListMessage, которые используют нового поставщика - их интерфейсы будутто же самое, и клиентский код не будет знать или заботиться о том, что он отличается.
Затем я создам новый дочерний класс MailingListFactory, который будет создавать новые объекты Recipient и Message новых классов.Все, что мне нужно сделать, это изменить экземпляр в моем файле настроек:
$mailingListFactory = new newMailingListProviderFactory($username, $password);
Поскольку остальная часть моего кода написана для интерфейсов, определенных в моих абстрактных фабриках, больше ничего менять не нужно.
Использование абстрактной фабрики гарантирует, что я никогда не попаду в ситуацию, когда код использует объекты mailChimpRecipient и newMailingListProviderMessage.
Это отвечает обеим моим целям:
Interchangeablity- Я могу поменять местами свои списки рассылки, и код все равно будет работать, как и раньше;
Повторное использование - я могу взять эти классы и использовать их в других проектах.
Это кажется наиболее элегантным способомсделай это.Если у кого-то есть способ получше, я бы хотел услышать об этом.Спасибо всем за ваши ответы.