Используя php 5.2, я пытаюсь использовать фабрику, чтобы вернуть службу контроллеру. Мой URI запроса будет иметь формат www.mydomain.com/service/method/param1/param2/etc. Затем мой контроллер вызовет сервисную фабрику, используя токен, отправленный в uri. Из того, что я видел, есть два основных пути, по которым я мог бы пойти с моей фабрикой.
Один метод:
class ServiceFactory {
public static function getInstance($token) {
switch($token) {
case 'location':
return new StaticPageTemplateService('location');
break;
case 'product':
return new DynamicPageTemplateService('product');
break;
case 'user'
return new UserService();
break;
default:
return new StaticPageTemplateService($token);
}
}
}
или несколько методов:
class ServiceFactory {
public static function getLocationService() {
return new StaticPageTemplateService('location');
}
public static function getProductService() {
return new DynamicPageTemplateService('product');
}
public static function getUserService() {
return new UserService();
}
public static function getDefaultService($token) {
return new StaticPageTemplateService($token);
}
}
Итак, учитывая это, У меня будет несколько общих служб, в которые я передам этот токен (например, StaticPageTemplateService и DynamicPageTemplateService), которые, вероятно, будут реализовывать другой фабричный метод, подобный этому, для захвата шаблонов, объектов домена и т. Д. И некоторые из них будут конкретными службами ( например, UserService), который будет 1: 1 для этого токена и не будет использоваться повторно. Таким образом, это кажется нормальным подходом (пожалуйста, дайте предложения, если это не так) для небольшого количества услуг. Но что насчет того, когда со временем мой сайт разрастется, и у меня появятся сотни возможностей. Это уже не кажется хорошим подходом. Я просто далек от начала или есть другой шаблон проектирования, который мне больше подходит? Спасибо.
ОБНОВЛЕНИЕ: @JSprang - токен фактически отправляется в uri, например, mydomain.com/location потребует службы, специфичной для loction и mydomain. com / news потребуется служба, предназначенная для новостей. Теперь для многих из них услуга будет общей. Например, многие страницы будут вызывать StaticTemplatePageService, в котором токен передается службе. Эта служба, в свою очередь, захватит шаблон «местоположение» или шаблон «ссылки» и просто выплюнет его обратно. Некоторым потребуется DynamicTemplatePageService, в котором передается токен, например, «новости», и эта служба захватит NewsDomainObject, определит, как его представить, и выплюнет его обратно. Другие, такие как «пользователь», будут специфичными для UserService, в котором у него будут такие методы, как Login, Logout и т. Д. Таким образом, токен будет использоваться для определения того, какая служба необходима, И если это общая служба, этот токен будет перешли в эту службу. Может быть, токен не t правильная терминология, но я надеюсь, что вы уловили цель.
Я хотел использовать фабрику, чтобы легко поменять сервис, который мне нужен, в случае изменения моих потребностей. Меня просто беспокоит, что после того, как сайт станет больше (как страниц, так и функциональности), фабрика станет довольно раздутой. Но я начинаю чувствовать, что просто не могу уйти от хранения сопоставлений в массиве (например, решение Стивена). Мне это просто не кажется ООП, и я надеялся найти что-то более элегантное.