【问题标题】:Using factory pattern for various components/modules对各种组件/模块使用工厂模式
【发布时间】:2016-11-07 19:54:05
【问题描述】:

假设我们有一个构建文章的系统。文章有一些组件验证器,清洁器,存储......在客户端构建文章我必须实例化每个组件:

    $title = 'title';
    $description = 'Description in html';

    //Cleaner just clean some things from each field.
    $cleaner = new Cleaner();

    //Validator throw exception if something is not correct
    $validator = new Validator();

    // Storage save files and article itself
    $storage = new Storage();

    //Dom Class get some files from description field
    $dom = new Dom();
    $files = $dom->getFiles($description);

    $storage->files($files);

    $article = new ArticleBuilder();
    $article->addTitle($validator->title($cleaner->title($title)));
    $article->addDescription($validator->description($cleaner->description($description)));
    $article->add....

没有这些,就不可能构建文章。

我的问题是: 我可以像这样使用工厂模式来创建所有这些:

          class ArticleFactory
        {
            private $article;

            public function __construct()
            {
                $this->article = new ArticleBuilder();
            }

            public function setTitle(string $title)
            {
                $title = ($this->validator())->title($title);
                $title = ($this->cleaner())->title($title);
                $this->article->addTitle($title);
            }

            public function setDescription(string $des)
            {
                $des = ($this->validator())->title($des);
                $des = ($this->cleaner())->title($des);
                $this->article->addDescription($des);
            }

            public function getArticle(): ArticleBuilder
            {
                return $this->article;
            }

            public function getFiles($description)
            {
               return ($this->dom())->getFiles($description);
            }

            public function storeFile($files)
            {
                ($this->storage())->files($files);
            }

            public function validator(): ValidatorInterface
            {
                return new Validator();
            }

            public function cleaner(): CleanerInterface
            {
                return new Cleaner();
            }

            public function storage(): StorageInterface
            {
                return new Storage();
            }

            public function dom(): DomInterface
            {
                return new Dom();
            }
        }

在客户端用上面的工厂创建文章更方便:

        $myTitle = 'my title';
        $myDes = 'mty description';
        $article = new ArticleFactory();
        $article->setTitle($myTitle);
        $article->setDescription($myDes);
        $files = $article->getFiles($description);
        $article->storeFile($files);

这是否违反任何 SOLID 原则?

有没有更好的方法?

【问题讨论】:

  • 我可以使用工厂模式来创建所有这些当然可以。问题是它会有多大用处。为此,我们需要询问我们的水晶球,因为您提供了零上下文。
  • 这个我不太明白。您有一个ArticleFactory,但您返回的是ValidatorCleanerStorage 类型。这些是Article 的派生词还是依赖项?
  • 我已经更新了我的回答。如果你想要更多的东西,请告诉我。谢谢
  • 您的设计确实很奇怪,但您必须解释整个问题域,以便我们提供更好的解决方案。

标签: oop design-patterns factory-pattern solid-principles


【解决方案1】:

ArticleFactory 类似乎违反了SRP,因为ArticleFactory 关注的不止一件事(构建、存储、验证和清理文章)。

Factory 模式和Builder 模式之间似乎也存在混淆。如果 ArticleFactory 类也构建文章,那么如果它有(组成)一个构建器并将构建过程委托给它,它会更干净。你真的需要建造师吗?创建新文章的过程是否如此复杂/昂贵,以至于构建器模式会增加价值?

在函数名称中使用名词(function ValidatorCleanerStorage)使代码难以理解。你在那里的意图是什么?

对函数使用动词,对类使用名词。

【讨论】:

    猜你喜欢
    • 2016-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多