寻找设计模式 - 一种具有不同来源的对象

时间:2017-01-26 17:45:15

标签: php design-patterns

使用CsvReader:

class CsvReader {
  public static function createFromString($csvString){
    /.../
    return new static($something)
  }
}

我计划使用来自不同来源的csvString进行操作:读取文件,来自http响应的主体等等。因此,我正在寻找设计模式,以便轻松创建此csvReaders对象。现在,我已经结束了这样的事情:

use SplFileInfo as UploadedFile;
use CsvReader as Reader;
use GuzzleHttp\Client as HttpClient;

class CsvFactory {
  public function createFromUploadedFile(UploadedFile $uploadedFile){
    return Reader::createFromString($uploadedFile->toString());
  }

  public function createFromHttpEndpoint(HttpClient $client, $url, $options = array()){
    $response = $client->request('GET', $url, $options);

    if($response->getStatusCode() != 200){
       throw new Exception('Http Code Not Ok', $response->getStatusCode());
    }

   return Reader::createFromString($response->getBody());
 }
}

我觉得可以用更好的方式完成。但是如何?

1 个答案:

答案 0 :(得分:1)

你需要问自己的问题是你想要做什么样的基础工作?设计模式是有用的工具,可帮助您理解和/或解释以特定方式组织代码的决策。但是,您无需使用任何特定的设计模式。

如果您希望将代码保留在此特定类中,则构建它的方式可以正常工作。但是,另一种方法是在toCsv接口中创建CSVable方法。然后,您可以将其附加到类,并强制它们定义在请求以CSV格式输出时应如何返回。然后,CSV类可以强制只给出实现CSVable接口的对象。

有很多方法可以实现这一目标,但你应该退后一步,找到适合你所做的事情的模式;在了解您想要的优点和缺点之前,找不到适用的模式。甚至可能没有完全符合您的用例的模式。