Php 需要创意模式的建议(建设者)

Php 需要创意模式的建议(建设者),php,design-patterns,builder,Php,Design Patterns,Builder,在我关于Stackoverflow的第一篇文章中,我想问一些关于我应该使用哪种模式(以及如何正确使用它)来构建我的程序的建议 (别犹豫,问我准确的答案,英语不是我的母语) 我正在开发的程序是关于组合几种形式的信息(关于广告活动的信息),结构应该是: 广告横幅的格式,具有大小、格式名称等属性 型号(可选),如果存在多种类型的广告产品,则包含格式 地区(可选),如果活动有多个地区(广告区),包含格式(如果指定,最终包括模型) 重新组合格式的发布者(按地区/型号,如果指定) 总而言之,我应该有以下

在我关于Stackoverflow的第一篇文章中,我想问一些关于我应该使用哪种模式(以及如何正确使用它)来构建我的程序的建议

(别犹豫,问我准确的答案,英语不是我的母语)

我正在开发的程序是关于组合几种形式的信息(关于广告活动的信息),结构应该是:

  • 广告横幅的格式,具有大小、格式名称等属性
  • 型号(可选),如果存在多种类型的广告产品,则包含格式
  • 地区(可选),如果活动有多个地区(广告区),包含格式(如果指定,最终包括模型)
  • 重新组合格式的发布者(按地区/型号,如果指定)
总而言之,我应该有以下4种可能的关联:

  • 出版商/格式,
  • 出版商/模型/格式,
  • 出版商/地区/格式,
  • 出版商/地区/模型/格式
我的想法引导我走向了Builder模式,因为有几种可能的关联,但我不熟悉这个模式,也不确定如何实现它

我的ConcreteBuilder是否应该是4个可能的关联(如发布者/格式的FormatBuilder或发布者/地区/模型/格式的DistrictModelBuilder),我的产品应该是Format、Model、District、Publisher

Director类代表表单还是表单属于客户机


提前感谢您的启发

我想你不是在说构建器模式。生成器模式用于处理接受许多可选参数的函数。你可能在考虑工厂模式

但对我来说,这听起来像是为了应用设计模式而应用设计模式。在盲目地应用别人的解决方案之前,我会仔细思考问题的实质

编辑:好吧,我想我误解了。如果您确定这些是唯一可能的组合,那么您可以为它们中的每一个创建子类。但听起来Builder是最灵活的解决方案。构建器应该是将相应组件添加到表单的方法,例如:

public class Form {
  ...
  public Form addModel() {
    this.models.push(new Model());
    return this;
  }
}

我不知道你说的产品是否应该是格式、型号、地区和出版商是什么意思。这些听起来不像是我的产品。我不知道什么是控制器或客户机,您在其他任何地方都没有提到它们。

我最终决定实现一个替代的构建器模式(在这里找到:):使用内部类作为构建器以保持有效状态

我提醒您,组装顺序是:发布者->地区->型号->格式(地区和型号可选)

因为我的英语不是很好,我更喜欢直接发布代码:

class Publisher{
// ATTRIBUTES
private $name;
private $districts;
private $models;
private $formats;

// GETTERS
...

// METHODES
private function __construct($builder) {
    $this->name = $builder->name;
    $this->districts = $builder->districts;
    $this->models = $builder->models;
    $this->formats = $builder->formats;
}


// BUILDER
public static class PublisherBuilder {
    private $name;
    private $districts; // catchment area
    private $models; // can be things like different car models
    private $formats;

    public function __construct($pName) {
        $this->name = $pName;
        $this->districts = array();
        $this->models = array();
        $this->formats = array();
    }

    public function setDistricts($pDistricts) { // the param is JSON-formatted      
        // If no Model declared by the user in the form
        // Loop over districts
            array_push($this->districts, new District.DistrictBuilder("name of the current district").setFormats("data about formats contained in the current district").build());

        // If several Models
        // Loop over districts
            array_push($this->districts, new District.DistrictBuilder("name of the current district").setModels("data about models contained in the current district").build());

        return $this;
    }

    public function setModels($pModels) {   // the param is JSON-formatted
        // Loop over models
            array_push($this->models, new Model.ModelBuilder("name of the current model").setFormats("data about formats contained in the current model").build());

        return $this;
    }

    public function setFormats($pFormats) { // the param is JSON-formatted
        // Loop over formats
            array_push($this->formats, new Format("data about the current format"));

        return $this;
    }

    public function build() {
        return new Publisher($this);
    }
} // end of inner class PublisherBuilder
}//Publisher类结束

当然,District和Model类与它们自己的构建器内部类具有相同的结构(Format类是“普通”类)

客户端只需在表单中的数据中循环访问发布服务器,然后调用Publisher.PublisherBuilder(“关于当前发布服务器的数据”)

使用此解决方案,似乎可以消除一些困难,同时保持生成器模式的灵活性


不要犹豫做出任何(建设性的)决定对这个实现的评论:)

谢谢你的回答,我承认这是为了应用一个,但我不得不这么做:这是为了一份实习报告,我希望这个应用程序可以重用/能够在出现其他可能的关联时发展。但我不明白为什么构建器模式不匹配:它不应该是cr吗通过组合多个部分(例如,首先是发布者部分,然后是此发布者中包含的区域,然后是这些区域中包含的格式)来创建对象?我看不出工厂模式在没有继承的情况下会如何应用。我不必从数据构建表单,我需要从表单构建发布者;)当我谈论产品、主管和客户机时,它们是来自Builder UML类图的类。最终的“产品”“应该是发布者,但发布者类具有可选属性,如District和Model。如果“地区”属性已实例化(存在),则格式将添加到地区(该地区本身包含在发布服务器中),而不是发布服务器。我将在几分钟内提交一个可能解决我的问题的解决方案:)主管由一名建筑工人组成。它负责通过在生成器上调用buildPart()方法来实现产品的组装过程。生成器定义了可用于组装产品的各个步骤。它定义了在构造产品时什么是合法的,以便在重新生成最终产品时具有有效状态。例如,如果没有buildPartA(),您可能无法构建PartB()。在为特定设计调用Builder.getResult()时,生成器负责产品的有效状态。您是否尝试设计产品类(发布者、格式、模型、地区)?您是否列出了组装数据时可能采用的流程和步骤?例如:1)定义格式,将格式分配给发布者2)定义格式,将格式分配给模型,将模型分配给发布者。。。您是否已将生成器界面定义为每个不同的步骤都有一个build()方法?还有获取内置发布服务器的getResult()方法吗?感谢您的回答,我想您正确理解了我的“结构”,除了(我的错,我没有提到它)我知道格式随表单中的数据附加到哪个发布服务器(或地区或型号)。所以组装顺序是Publisher->[地区->[型号->