通过克隆生成对象
原型是抽象工厂的另一种变化形式,它也叫克隆模式,具体产品类会变成生成它们自身的基础。它和抽象工厂一样,也是创建对象。不过它是使用clone的方式进行创建。
优点:
减少了重复的new操作,因为实例化一个对象是需要很大开销的,每次创建新实例都会重新初始化
原型模式是先创建好对象,再对其进行克隆,免去了重复初始化操作,系统只需要拷贝内存
缺点:
每个具体产品类必须要包 clone 方法
对已知的产品类进行改造起来非常麻烦
拿生活中的例子来举例,孙悟空的毛一吹就可以变化成很多的猴子猴孙,这就好比使用了原型模式。还有我们小时候玩过的红色警戒,我们可以通过兵工厂来制造出许多坦克、士兵等等
复杂实现:

// 兵工厂abstract Munition{abstract launch():string;}// 战车工厂abstract WarChariot{abstract launch():string;}// 具体产品:动员兵class SovietSoldier extends Munition{public function launch(): string{return '攻击!';}public function __clone(){// do something}}// 具体产品:美国大兵class AmericaSoldier extends Munition{public function launch(): string{return '攻击!';}public function __clone(){// do something}}// 具体产品:犀牛坦克class SovietTank extends WarChariot{public function launch(): string{return '攻击!';}public function __clone(){// do something}}// 具体产品:盟军坦克class AmericaTank extends WarChariot{public function launch(): string{return '攻击!';}public function __clone(){// do something}}
class Factory{public Munition $munition;public WarChariot $WarChariot;public function __construct(Muniton $muntion,WarChariot $warChariot){$this->munition = $muntion;$this->munition = $warChariot;}// 创建各种士兵public function createMunition(): Munition{return $this->munition;}// 创建各种坦克public function createWarChariot: WarChariot{return $this->warChariot;}}
$factory = new Factory(new SovietSoldier(),new SovietTank(),)// 创建士兵$factory->createMunition()->launch();// 创建坦克$factory->createWarChariot()->launch();
总结:
原型模式的好处是,它不需要像工厂方法模式或抽象方法模式那样每次加入新的产品家族时,都要为产品创建相关的具体创建者类。减少了代码量
