设计模式详解 PHP版
  • 设计模式简介&原则
  • 常见设计模式
    • 工厂模式(Factory)
      • 简单工厂模式(Simple Factory)
      • 工厂方法模式(Factory Method)
      • 抽象工厂模式(Abstract Factory)
      • 三种工厂模式对比
    • 单例模式(Singleton)
      • 场景*memcache操作类
    • 注册树模式
    • 适配器模式(Adapter)
    • 策略模式(Strategy)
    • 数据对象映射模式
    • 观察者模式(observer)
    • 原型模式(Prototype)
    • 装饰器模式(Decorator)
    • 迭代器模式 (Iteration)
    • 桥接模式(Bridge)
    • 建造者模式(Builder)
    • 命令行模式(Command)
    • 组合模式(Composite)
    • 外观模式(Facade)
    • 享元模式(Flyweight)
    • 解释器模式(Interpreter)
    • 中介者模式(Mediator)
    • 备忘录模式(Memento)
    • 代理模式(Proxy)
    • 责任链模式(Responsibility Chain)
    • 状态模式(State)
    • 模板方法模式(Template Method)
    • 访问者模式(Visitor)
  • 资料
Powered by GitBook
On this page
  • 概述:
  • 适合场景:
  • 模式架构简单代码实现示例:
  • 简单场景示例:

Was this helpful?

  1. 常见设计模式

原型模式(Prototype)

概述:

原型模式(Prototype)是创建型模式的一种,其特点在于通过“复制”一个已经存在的实例来返回新的实例,而不是新建实例。被复制的实例就是我们所称的“原型”,这个原型是可定制的。

适合场景:

原型模式多用于创建复杂的或者耗时的实例,因为这种情况下,复制一个已经存在的实例使程序运行更高效;或者创建值相等,只是命名不一样的同类数据。

模式架构简单代码实现示例:

<?php

interface Prototype {
    public function copy(); 
}

class ConcretePrototype implements Prototype {
    private  $_name;
    public function __construct($name) { $this->_name = $name; } 
    public function copy() { return clone $this;}
}

class Demo {}

// client
$demo = new Demo();
$object1 = new ConcretePrototype($demo);
$object2 = $object1->copy();

简单场景示例:

假设有一款‘文明’风格的游戏,可在区块组成的格子中操作战斗单元。区块分:海洋(sea)、平原(plain)、forest(森林) 我们允许用户允许用户在完全的不同的环境里选择。

<?php

class sea{}

class EarthSea extends sea{}

class MarsSea extends sea{}

class Plains{}

class EarthPlains extends Plains{}

class MarsPlain extends Plains{}

class Forest{}

class EarthForest extends Forest{}

class MarsForest extends Forest{}

class TerrainFactory
{
   private $sea;
   private $forest;
   private $plains;

   function __construct(Sea $sea, Plains $plains, Forest $forest)
   {
       $this->sea = $sea;
       $this->plains = $plains;
       $this->forest = $forest;
   }

   function getSea()
   {
       return clone $this->sea;
   }

   function getPlain()
   {
       return clone $this->plains;
   }

   function getForeast()
   {
       return clone $this->forest;
   }
}

$factory = new TerrainFactory(new EarthSea(), new EarthPlains(), new  EarthForest);

var_dump($factory->getSea());
var_dump($factory->getPlain());
var_dump($factory->getForeast());

//输出
//class EarthSea#5 (0) {
//}
//class EarthPlains#5 (0) {
//}
//class EarthForest#5 (0) {
//}
Previous观察者模式(observer)Next装饰器模式(Decorator)

Last updated 6 years ago

Was this helpful?