PHP example detailed explanation of Constructor Prototype Pattern prototype pattern, prototypepattern_PHP tutorial

WBOY
Release: 2016-07-12 09:07:27
Original
1370 people have browsed it

php example detailed explanation of Constructor Prototype Pattern prototype pattern, prototypepattern

Main role in prototype pattern

Abstract prototype (Prototype) role: declare an interface that clones itself
Concrete Prototype role: implement an operation of cloning yourself

When most of a class is the same and only some parts are different, if a large number of objects of this class are needed, it will be very expensive to instantiate the same parts repeatedly every time, and if the object is created before cloning Those parts that are the same can save money.

An implementation method for PHP is to handle the initialization of this class separately with the __construct() and initialize functions. The prototype is placed in construct, which is the public part, and the special part of each object is placed in initialize. In this way, we first create a class without initializing it, and then clone this class and then initialize it every time.

This is mentioned in the zend framework official manual http://framework.zend.com/manual/2.0/en/user-guide/database-and-models.html, but it is not explained in detail. Let me analyze it below.

1. Introduction

There is an albumTable class in the zf2 model, which is equivalent to an assistant class for operating database actions, and tablegateway is used in it.

In order to initialize the albumtable with the same class every time, the initialization work is placed in getServiceConfig() of the module.php file in the root directory, which uses the factory mode, and through the callback function, when each ServiceManager ($sm ) will automatically create an alumTable when an object needs to be instantiated. We can see from the code below that creating an albumTable also requires creating an AlbumTableGateWay in the same way. This class uses the prototype pattern we are going to talk about.

2. Detailed code explanation

public function getServiceConfig()
  {
    return array(
      'factories' => array(
        'Album\Model\AlbumTable' => function($sm) {
          $tableGateway = $sm->get('AlbumTableGateway');
          $table = new AlbumTable($tableGateway);
          return $table;
        },
        'AlbumTableGateway' => function ($sm) {
          $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
          $resultSetPrototype = new ResultSet();
          $resultSetPrototype->setArrayObjectPrototype(new Album());//这个就是一个不变的原型
          return new TableGateway('album', $dbAdapter, null, $resultSetPrototype);//传入到TableGateWay的构造函数中去
        },
      ),
    );
  }
Copy after login

Note that it is not TableGateWay that uses the prototype pattern but the ResultSet class. Whenever the tablegateway calls methods such as select() or insert(), a ResultSet will be created to represent the result. The common parts of these ResultSets will be cloned, and unique partial classes such as data will be initialized.

3. More code examples

In order to understand this prototype more clearly, let’s put aside the big framework of zend and look at a complete code example. Example from

PHP Constructor Best Practices And The Prototype Pattern< /a>

The first half of this article about prototype pattern is actually a mixture of how to use inheritance in constructors to improve scalability. The two patterns may not seem easy to understand. Let’s look directly at the final code part about prototype pattern. .

<&#63;php
//框架中很常见的adapter类,用来适配各种数据库,封装一些基本数据库连接操作。
//相当于上面代码中的adapter类
class DbAdapter {
  public function fetchAllFromTable($table) {
    return $arrayOfData;
  }
}
//运用prototype pattern的类,注意construct和initialize是分开的
//相当于上面zend 代码里面的ResultSet类
class RowGateway {
  public function __construct(DbAdapter $dbAdapter, $tableName) {
    $this->dbAdapter = $dbAdapter;
    $this->tableName = $tableName;
  }
  public function initialize($data) {
    $this->data = $data;
  }
  /**
   * Both methods require access to the database adapter
   * to fulfill their duties
   */
  public function save() {}
  public function delete() {}
  public function refresh() {}
}
//相当于上面代码中的TableGateway类,关于gateway可以具体去了解一下。
class UserRepository {
  public function __construct(DbAdapter $dbAdapter, RowGateway $rowGatewayPrototype = null) {
    $this->dbAdapter = $dbAdapter;
    $this->rowGatewayPrototype = ($rowGatewayPrototype) &#63; new RowGateway($this->dbAdapter, 'user')
  }
  public function getUsers() {
    $rows = array();
    foreach ($this->dbAdapter->fetchAllFromTable('user') as $rowData) {
      $rows[] = $row = clone $this->rowGatewayPrototype;
      $row->initialize($rowData);
    }
    return $rows;
  }
}
Copy after login

These classes actually correspond to the classes in the zend code above

Dbadapter -- adpater

RowGateWay -- ResultSet

UserRepository - TableGateWay

See the comments in the code for details.

The RowGateWay here can clearly see that a large number of instantiations are required in getusers, so the prototype mode is very necessary.

The following is the code to use this class

class ReadWriteRowGateway extends RowGateway {
  public function __construct(DbAdapter $readDbAdapter, DbAdapter $writeDbAdapter, $tableName) {
    $this->readDbAdapter = $readDbAdapter;
    parent::__construct($writeDbAdapter, $tableName);
  }
  public function refresh() {
    // utilize $this->readDbAdapter instead of $this->dbAdapter in RowGateway base implementation
  }
}
// usage:
$userRepository = new UserRepository(
  $dbAdapter,
  new ReadWriteRowGateway($readDbAdapter, $writeDbAdapter, 'user')
);
$users = $userRepository->getUsers();
$user = $users[0]; // instance of ReadWriteRowGateway with a specific row of data from the db
Copy after login

The above content is a detailed explanation of the Constructor Prototype Pattern prototype pattern in PHP examples introduced by the editor. I hope you like it.

www.bkjia.comtruehttp: //www.bkjia.com/PHPjc/1061520.htmlTechArticlephp example detailed explanation Constructor Prototype Pattern prototype pattern, prototypepattern main role in prototype pattern abstract prototype (Prototype) role: declare a Clone your own interface specific prototype...
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template