原型模式

定义

用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。

使用场景

以下场景可以使用原型模式

  • 如果一个系统想要独立它想要使用的对象时,可以使用原型模式。让系统面向接口编程,系统需要新对象时,可以通过克隆原型对象。
  • 如果需要使用的对象是运行时刻确定的,可以使用原型模式。
  • 在系统内存在大量相同或相似的对象创建时,可以使用原型模式。若使用传统模式创建复杂且耗时,原型模式生成对象高效。
结构和说明
  • Prototype: 定义clone自身方法的接口,用来约束想要克隆自己的类,他们都需要实现这个方法。
  • ConcretePrototype: 具体实现Prototype接口的类,这些类真正实现了克隆自己的方法。
  • client: 使用原型的客户端。
深度克隆、浅度克隆

无论是自己实现的克隆方法还是语言层面实现的克隆方法,都存在一个深度克隆和浅度克隆的问题。

  • 浅度克隆: 只负责克隆按值传递的数据(比如基本类型、字符串类型)。
  • 深度克隆: 除了浅度克隆的值外,还会克隆引用类型的数据。基本上被克隆的实例所有的属性都会被克隆一份新的出来。

PHP默认的克隆是浅度克隆模式。

testA1 = $testA1;
    }

    public function getTestA1()
    {
        return $this->testA1;
    }

}

$testA1 = new TestA1();

$testB1 = new TestB1($testA1);

$cloneTestB1 = clone $testB1;

var_dump($testB1->getTestA1() === $cloneTestB1->getTestA1());

运行结果

feng@feng:/var/www/test.com$ php test/index.php 
bool(true)
原型管理器

如果一个系统中原型实例比较多,比如系统中的原型可以被动态创建和销毁。那么就需要在系统中维护一个当前可用的原型的注册表,这个注册表就被称为原型管理器。
有了原型管理器后,一般情况下,除了向原型管理器里面添加原型对象的时候通过new来创造对象。其余的时候都是通过原型管理器来获取对象。这样就实现了动态管理对象,动态切换对象。

你可能感兴趣的:(原型模式)