php设计模式之原型模式详解

原型模式是一种创建型设计模式,用于便捷地复制已有对象。在此示例中,我们展示了如何在PHP中利用__clone魔术方法实现对象的克隆。Page类包含了标题、正文、作者和评论等私有属性,通过克隆,可以创建页面的副本,同时修改副本的某些属性,如将新页面的标题设为原页面标题的副本。测试代码显示了克隆后的对象与原对象的关系,以及克隆过程中数据的更新。
摘要由CSDN通过智能技术生成

原型模式

原型模式是一种创建型设计模式, 使你能够复制已有对象, 而又无需使代码依赖它们所属的类。
所有的原型类都必须有一个通用的接口, 使得即使在对象所属的具体类未知的情况下也能复制对象。 原型对象可以生成自身的完整副本, 因为相同类的对象可以相互访问对方的私有成员变量。

  1. 原型模式提供了一种复制已有对象的简便方式, 可代替直接复制对象的所有成员变量来对对象进行重构的方法
  2. 原型模式让你能够在被克隆类的内部进行克隆工作, 因此可以不受限制地访问类的私有成员变量。
  3. 创建原型接口, 并在其中声明 克隆方法。 如果你已有类层次结构, 则只需在其所有类中添加该方法即可
  4. 在PHP中有魔术方法__clone,使用原型模式时,只需要重写这个方法就可以了,在这个方法中做需要做的事儿

代码实现

  • 原型类
class Page
{
    /**
     * 全是私有变量
     * @var  string
     */
    private string $title;

    private string $body;

    /**
     * @var  Author
     */
    private Author $auther;

    private array $comments = [];

    /**
     * @var DateTime
     */
    private DateTime $data;

    public function __construct(string $title, string $body, Author $author)
    {
        $this->title = $title;

        $this->body = $body;

        $this->auther = $author;

        $this->auther->addToPage($this);
        
        $this->data = new \DateTime();
    }

    public function addComments(string $commend):void
    {
        $this->comments[] = $commend;
    }

    /**
     * @Notes: 需要克隆的数据
     *
     * @User: Jay.Li
     * @Methods: __clone
     * @Date: 2022/3/20
     */
    public function __clone()
    {
        $this->title = "Copy of " . $this->title;

        $this->auther->addToPage($this);

        $this->comments = [];

        $this->data = new \DateTime();
    }


}

class Author
{
    /**
     * @var  string
     */
    private string $name;

    /**
     * @var  array
     */
    private array $pages = [];

    public function __construct(string $name)
    {
        $this->name = $name;
    }


    public function addToPage(Page $page)
    {
        $this->pages[] = $page;
    }
}
  • 测试
$author = new Author("李四");

$page = new Page("大家好", "展示问候语呀~", $author);

$page->addComments("start | stop | reload");

$cloneObj = clone $page;

print_r($cloneObj);
  • 输出
//Page Object
//(
//    [title:Page:private] => Copy of 大家好
//    [body:Page:private] => 展示问候语呀~
//    [auther:Page:private] => Author Object
//        (
//            [name:Author:private] => 李四
//            [pages:Author:private] => Array
//                (
//                    [0] => Page Object
//                        (
//                            [title:Page:private] => 大家好
//                            [body:Page:private] => 展示问候语呀~
//                            [auther:Page:private] => Author Object
// *RECURSION*
//                            [comments:Page:private] => Array
//                                (
//                                    [0] => start | stop | reload
//                                )
//
//                            [data:Page:private] => DateTime Object
//                                (
//                                    [date] => 2022-03-20 19:50:09.899059
//                                    [timezone_type] => 3
//                                    [timezone] => Asia/Shanghai
//                                )
//
//                        )
//
//                    [1] => Page Object
// *RECURSION*
//                )
//
//        )
//
//    [comments:Page:private] => Array
//        (
//        )
//
//    [data:Page:private] => DateTime Object
//        (
//            [date] => 2022-03-20 19:50:09.899077
//            [timezone_type] => 3
//            [timezone] => Asia/Shanghai
//        )
//
//)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值