浅谈PHP设计模式的原型模式

简介:

原型模式,属于创建型模式的一种。
主要针对对象进行克隆,把被克隆的对象称之为原型,原型模式称之为克隆模式也许更为贴切。
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

适用场景:

  1. 实例化对象的资源开销过大时可直接克隆。
  2. 需要循环创建大量对象,此时用克隆也是一个挺不错的选择。

优点:

  1. 高性能:如果创建对象的过程复杂,或者消耗大量资源,那么直接克隆就可以高性能的简化这一流程。
  2. 实现简单,某些场景下,相比于实例化对象的各种前置操作,而克隆一个关键字就能搞定。

缺点:

克隆出来的对象与原型对象不是一个,可能在某些业务场景上,可能会受影响

代码:

//抽象出来一个操作系统的类
abstract class OS {
    public $os;
    //setOS可以理解为安装操作系统
    public function installOS($os) {
        $this->os = $os;
    }

    //runOS可以理解为运行操作系统
    public function runOS() {
        return $this->os . PHP_EOL;
    }

    //__clone方法是原型模式中需要有的,尽管可能用不上
    abstract function __clone();
}


class Windows extends OS{
    public function __clone() {}
}


class Linux extends OS{
    public function __clone() {}
}


//调用端============================================
//伟大的工程师们开发好了两套操作系统
$windows = new Windows();
$linux   = new Linux();

//把它们克隆到光盘上,分别给3个用户安装。这样就不用在从零开发操作系统了,直接复制开销极小,然后把它们运行起来。
for($i = 0; $i < 3; $i ++) {
    $new_windows = clone $windows;
    $new_windows->installOS('windows');
    echo $new_windows->runOS();
}


//把它们克隆到光盘上,分别给2个用户安装。这样就不用在从零开发操作系统了,直接复制开销极小,然后把它们运行起来。
for($j = 0; $j < 2; $j ++) {
    $new_linux = clone $linux;
    $new_linux->installOS('linux');
    echo $new_linux->runOS();
}
0 条评论
请不要发布违法违规有害信息,如发现请及时举报或反馈
还没有人评论呢,速度抢占沙发!
相关文章
  • 一般做业务开发,不太容易有大量使用设计模式的场景。这里总结一下在业务开发中使用较为频繁的设计模式。当然语言为Java,基于Spring框架。1 策略模式(Strategy Pattern)一个类的行为...

  • 简述 将各个功能拆分后分别封装(各功能解耦),需要时可自由组合(包括执行顺序) 话不多说,看个优化案例吧。 优化案例 最初版 以下是模拟客户端想服务端发送请求的业务流程。 客户端调用代码如下。 // ...

  • 1、模式描述 定义一个算法的系列,将其各个分装,并且使他们有交互性。策略模式使得算法在用户使用的时候能独立的改变。 在 Java 中,从 JDK1.8 开始支持函数式编程,就是策略模式的一种体现,且无...

  • 简介: 迭代器模式,是行为型的设计模式。 提供一中方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。 适用场景: 除了学习,在PHP中几乎没有应用场景。 优点: 学习意义远大于实际...

  • 简介 访问者设计模式(Visitor Design Pattern)的定义是,允许一个或多个操作应用到一组对象上,解耦操作和对象本身。 在使用访问者模式的时候,被访问的元素通常不是单独存在的,它们存储...

  • 简介 中介设计模式(Mediator Design Pattern)定义了一个单独的(中介)对象,来封装一组对象之间的交互。 如果对象之间存在大量的相互关联和调用,若有一个对象发生变化,则需要跟踪和该...

  • 简介: 模板方法模式,是行为型的设计模式。 定义一个操作中的算法的骨架,而将一些步骤延迟到子类当中,使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。 通俗讲,模板方法模式是偏向继承的...

  • 一般做业务开发,不太容易有大量使用设计模式的场景。这里总结一下在业务开发中使用较为频繁的设计模式。当然语言为Java,基于Spring框架。1 享元模式(Flyweight Pattern)如果系统中...

  • 一般做业务开发,不太容易有大量使用设计模式的场景。这里总结一下在业务开发中使用较为频繁的设计模式。当然语言为Java,基于Spring框架。1 责任链模式(Chain of Responsibilit...

  • 简介 在某些情况下,为了更好地描述某一些特定类型的问题,我们可以创建一种新的语言,这种语言拥有自己的表达式和结构,即文法规则。 解释器设计模式(Interpreter Design Pattern)描...

  • 没人疼就去健身,练完浑身疼。 让你的对象,知悉状况 自定义实现观察者模式 Internet气象观测站 应用就是利用WeatherData对象取得传感器数据,并更新三个布告板:目前状况、气象统计和天...

  • 什么是单例多例 单例:就是所有的请求都用一个对象来处理,service和dao层的对象通常都是单例的, 之所以用单例,是因为没必要每个请求都新建一个对象,这样子   既浪费CPU又浪费内存; 单例...

  • 简介: 备忘录模式,属于行为型的设计模式。 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。 备忘录模式顾名思义,就是存档功能,...

  • 动态代理和责任链设计模式适用范围广,在Spring和MyBatis有着重要的应用,比如SpringAOP、Mybatis的插件技术,想要搞懂当中的技术原理必须掌握上面两个设计模式。     代理模式可...

  • 什么是设计模式设计模式(英语 design pattern)是对面向对象设计中反复出现的问题的解决方案。这个术语是在1990年代由Erich Gamma等人从建筑设计领域引入到计算机科学中来的。这个术...

  • 简述 对客户端隐藏目标类,创建代理类拓展目标类,并且对于客户端隐藏功能拓展的细节,使得客户端可以像使用目标类一样使用代理类,面向代理(客户端只与代理类交互)。 话不多说,看一个优化案例。 优化案例 最...

  • 一、装饰器模式   在软件开发过程中,由于需求的改动,可能面临对某个或某些对象新增一些新的功能的需求。根据开闭原则,新增功能我们也不能直接去修改 原有的类,而如果使用继承的方式去实现,可能出现“子类爆...

  • 大家好,我是三友~~ 之前有小伙伴私信我说看源码的时候感觉源码很难,不知道该怎么看,其实这有部分原因是因为没有弄懂一些源码实现的套路,也就是设计模式,所以本文我就总结了9种在源码中非常常见的设计模式,...

  • 简介: 桥接模式又叫桥梁模式,属于结构型模式。目的是将抽象与实现分离,使它们都可以独立的变化,解耦。继承有很多好处,但是会增加耦合,而桥接模式偏向组合和聚合的方式来共享。 适用场景: 不希望或不适用使...

  • 设计模式       设计模式这一概念最早起源于建筑领域,是Christopher Alexander在其著作《建筑模式语言》中首次提及, 而后经过岁月的洗礼与沉淀,由我们的前辈们引入到软件设计领域,...