Совет по фабричному методу

Используя 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 правильная терминология, но я надеюсь, что вы уловили цель.

Я хотел использовать фабрику, чтобы легко поменять сервис, который мне нужен, в случае изменения моих потребностей. Меня просто беспокоит, что после того, как сайт станет больше (как страниц, так и функциональности), фабрика станет довольно раздутой. Но я начинаю чувствовать, что просто не могу уйти от хранения сопоставлений в массиве (например, решение Стивена). Мне это просто не кажется ООП, и я надеялся найти что-то более элегантное.

6
задан heath 7 January 2011 в 19:52
поделиться