Help us understand the problem. What is going on with this article?

デザインパターン×PHP - Prototype

More than 5 years have passed since last update.

はじめに

増補改訂版Java言語で学ぶデザインパターン入門を利用して、デザインパターンを学習していこうと思います。
その備忘録として、徒然にQiitaに投稿していきます。

Prototypeパターンの構成要素

役名 概要
Prototype インスタンスをコピーして新しいインスタンスを作成するためのメソッドを定義する親クラス
ConcretePrototype Prototypeクラスのサブクラスで、Productクラスで定義されたコピー用のメソッドを実装するクラス
Client インスタンスをコピーするメソッドを利用して、新しいインスタンスを作成する

Prototypeパターンのクラス図

Prototypeパターンのクラス図

Prototypeのメリット

  • クラスが増えすぎることを防止
    ー インスタンスの種類が多すぎて、それらを別々のクラスで管理するとクラスが増えすぎてしまうことを防げる。
  • クラスからのインスタンス生成がときに役立つ
    ー 決まった手順がなにユーザの操作のもとに作成されたインスタンスを複製したいときには、クラスがらインスタンスを作成することは非常に困難。
  • クラス間の密結合を防止
    ー Prototypeパターンでは、PrototypeとClientのクラスのなかに、ContentPrototypeのクラス名が出てくることはない。この切り離しができていることによって、再利用が可能となっている。

「浅いコピー」と「深いコピー」

PHPでは言語機能としてcloneキーワードが提供されています。

ただ、このcloneを使用した場合、変数に格納された値がそのままコピーできるけど、オブジェクトの参照を格納した変数では、参照がコピーされてしまいます。
つまり、コピー元とコピー先で、共通のオブジェクトを参照しているので、コピー元のオブジェクトを変更すると、コピー先のオブジェクトも変更されちゃいます。
このコピーは『浅いコピー』です。

これに対して、内部の参照もコピーするのが『深いコピー』です。
この違いに関しては、PHPにおけるインスタンスのシャローコピーとディープコピー | この先生きのこるにはが詳しく書かれています。

深いコピーの実装は、マジックメソッドである __clone() を利用します。
PHPで使うGoFパターン ひとり Advent Calendar - プロトタイプ - Qiita では、

public function __clone () {
    foreach ( $this->_Values as $key => $val ){
        if ( is_object ( $val ) ) $this->$key = clone $val;
        else                      $this->$key = $val;
    }
}

という実装を行って、『深いコピー』に対応しています。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away