Oop 基于多个参数创建不同的对象

Oop 基于多个参数创建不同的对象,oop,design-patterns,Oop,Design Patterns,我有一个RESTAPI。我需要创建presentation(DTO)对象,但是这个对象的构造取决于请求-它有15%的不同。 我想知道我应该用什么图案 我的情况是: //presentation-DTO class Item { private $name; private $price; private $tags; private $liked; //is Liked by logged user ... public function __c

我有一个RESTAPI。我需要创建presentation(DTO)对象,但是这个对象的构造取决于请求-它有15%的不同。 我想知道我应该用什么图案

我的情况是:

//presentation-DTO
class Item {
    private $name;
    private $price;
    private $tags;
    private $liked; //is Liked by logged user
    ...

    public function __construct(Item $item, bool $liked, ...)
    {
        $this->name = $item->getName();
        $this->price = $item->getPrice();
        $this->tags = $item->getTags();
        $this->liked = $liked;
        ...
    }
}
当用户未登录时-我不需要$

显示项目列表时-我不需要$tags

还有更多的属性可以像上面那样工作

我的第一个想法是使用生成器原理

$itemBuilder = new ItemBuilder();
$itemBuilder->setItem($item);
...
if($user) {
    $itemBuilder->setUserLiked($userLiked);
    ...
}
return $itemBuilder->build();
它解决了构造函数中参数太多的问题

但是,我仍然不需要构造所有的参数——例如,我不需要标签(在列表上)。由于我使用延迟加载,我不希望dto构造函数调用它们

所以我想,也许是工厂。。但是我的问题是太多(可选)参数返回


您将如何解决这一问题?

对不起,我没有必要的要点来发表评论,因此没有答案

您想用
类做什么。您的类是
Item
,第一个参数也是
Item
类型。我无法想象它将如何运作

我更愿意保持业务登录,以便在单独的类中设置适当的属性:

/**
 * A class for business logic to set the proper properties
 */
class ItemProperties {
    private $item;
    public $isLogin    = false;
    public $showList   = false;
    .....

    public function __construct(Item &$item) {
        //  set all properties;
    }


    public function getProperties() {
        $retVal     = [];
        if($this->isLogin == true) {
            $retVal['liked']    = true;
        }

        if($this->showList == true) {
            $retVal['tags'] = $this->item->getTags();
        }

        if(....) {
            $retVal['...']  = $this->item->.....();
        }

        return $retVal;
    }
}

/**
 * DTO
 */
class Item {
    public function __construct(ItemProperties $itemProps) {
        $this->setItemProps($itemProps);
    }

    // If you prefer lazy loading here...maybe make it public
    // and remove call from constructor.
    private function setItemProps(&$itemProps) {
        $properties = $itemProps->getProperties();
        foreach($properties AS $propName => $propValue) {
            $this->$propName    = $propValue;
        }
    }
}


// Usage:
$itemProps = new ItemProperties($Item);
//  set other properties if you need to...
$itemProps->isLogin = false;

$item   = new Item($itemProps);

当用户未登录[1]时,您不想将
$liked
作为参数传递给构造函数吗?或者[2]可以将
$liked
作为参数传递给构造函数,但您不想调用
$this->liked=$item->getLiked()
自用户未登录时起
-我不需要$code>。再解释一下,有两种情况。[a] 有关$liked的信息来自单独的数据。我无法从$item对象获取它们-需要将它们作为参数传递。[b] 有关$tokes的信息来自$item对象,但我不希望在构造函数中调用它们,因为我不需要它们。因此,在案例[a]中,我不想通过它们[1]。以防万一,我不想给他们打电话。在bot的情况下,如果我不需要这些属性,我不想在dto对象中包含这些属性。您很了解这一点。Item类是DTO,它获取Item属性,即ORM实体。感谢您的回答,它给了我一个全新的视角。只有一个想法需要重新考虑。在您的解决方案中,ItemProperties类的工作方式类似于构建器(存储创建对象所需的信息),而且它还存储有关对象将具有哪些属性的信息,因此它有多个职责。我认为,ItemProperties类应该只存储数据并验证是否设置了正确的类型。。。应该有不同的类来确定DTO将具有哪些属性。另外,getProperties方法将很难保持简单并对其进行开发。