gpt4 book ai didi

php - 工厂方法的建议

转载 作者:可可西里 更新时间:2023-11-01 13:28:59 26 4
gpt4 key购买 nike

使用 php 5.2,我尝试使用工厂将服务返回给 Controller 。我的请求 uri 的格式为 www.mydomain.com/service/method/param1/param2/etc。然后,我的 Controller 将使用 uri 中发送的 token 调用服务工厂。据我所知,我的工厂可以走两条主要路线。

单一方法:

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);
}
}

因此,鉴于此,我将有一些通用服务,我将在其中传递该 token (例如,StaticPageTemplateService 和 DynamicPageTemplateService),这些 token 可能会像这样实现另一个工厂方法来获取模板、域对象等。还有一些将是特定服务(例如,UserService),它们将与该 token 1:1 且不会重复使用。因此,对于少量服务,这似乎是一种不错的方法(如果不是,请提出建议)。但是,随着时间的推移和我的网站的增长,当我最终拥有 100 多种可能性时呢?这似乎不再是一个好方法。我是刚开始还是有另一种设计模式更合适?谢谢。

更新:@JSprang - token 实际上是在 uri 中发送的,例如 mydomain.com/location 需要特定于位置的服务,而 mydomain.com/news 需要特定于新闻的服务。现在,对于其中的很多,服务将是通用的。例如,许多页面将调用 StaticTemplatePageService,其中将 token 传递给服务。该服务反过来将获取“位置”模板或“链接”模板,然后将其吐出。有些将需要 DynamicTemplatePageService,其中传递 token ,如“新闻”,该服务将获取 NewsDomainObject,确定如何呈现它并将其吐出。其他的,比如“用户”将特定于 UserService,其中它将具有登录、注销等方法。所以基本上, token 将用于确定需要哪个服务,如果它是通用服务,则该 token 将是传递给那个服务。也许 token 不是正确的术语,但我希望你明白了。

我想使用工厂,以便在我的需求发生变化时轻松换出我需要的服务。我只是担心网站变大(页面和功能)后,工厂会变得相当臃肿。但我开始觉得我无法摆脱将映射存储在数组中(就像斯蒂芬的解决方案)。这对我来说并不是 OOP,我希望找到更优雅的东西。

最佳答案

我认为当您的站点变大时,无法避免这种 token 服务映射维护工作。不管你如何实现这个列表、开关 block 、数组等,总有一天这个文件会变得很大。所以我的意见是避开这个列表,让每个token成为一个服务类,对于那些通用的服务,你可以继承它们,像这样

class LocationService extends StaticPageTemplateService { 
public function __construct(){
parent::__construct('location');
}
}

class ServiceFactory {
public static function getInstance($token) {
$className = $token.'Service';
if(class_exist($className)) return new $className();
else return new StaticPageTemplateService($token);
}
}

这样就可以避免每次添加或更改token时都去编辑工厂类文件,只需要更改具体的token文件即可。

关于php - 工厂方法的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4627462/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com