PHPでの詳細な3つの古典的なパターン

シングルトン

:意味シングルトン
オブジェクト作成モードとして、性を保証特定のクラスの唯一のシングルトンインスタンス、およびグローバルシステム全体を提供するために、インスタンスをインスタンス化します。これは、コピーのインスタンスを作成しませんが、内部ストレージのシングルトンインスタンスへの参照を返します。
シングルトン三つの要素: 
1.ストレージクラスの静的インスタンス変数ユニーク。 
2.クローニングおよびコンストラクタ機能が存在しないように、単一の実施の形態を意味し、外部でインスタンス化するには、プライベートでなければなりません。 
3.別の外部アクセスを提供する公共静态クラスの一意のインスタンスを返すメソッドを。
シングルトンパターン意味:
開発したオブジェクト指向の方法を使用するときにアプリケーションがデータベース操作の大規模な数になりますので、主にPHPのデータベースアプリケーションでアプリケーション嘘を、シングルトン場合は、消費新しい操作の多くを回避することができます資源。単純にシステムリソースを節約するのではなく、再び再利用をする時期PHPクラス後の各インスタンス化は、対応するリソースを一掃しますので、一度インスタンス化するには、避けるの重複は、インスタンス化。
シーンシングルトンパターンを使用した: 
1.データベース操作を、新たなデータ・パスの動作は、それによってシステムリソースとメモリリソースの消費を低減する、減少させます。 
リソースの割り当てはグローバルで、システム内の共有リソースの設定、単回使用の実施の形態では、各メモリを読み取るために消費され、システムリソースを持って来るを低減するように構成することができます。
コードは示しています。

<?php
class Single
{
    public static $attribute = '';
    public static $instance = '';
    private function __construct($attribute = '个人技术')
    {
        self::$attribute = $attribute;
    }
    public static function getInstance($attribute = '我是编程浪子走四方1')
    {
        if (!(self::$instance instanceof self)) self::$instance = new self($attribute);
        return self::$instance;
    }
}

シングルトンと非シングルトンパターンの違い:

class Single {
    public function index() {
        return '';
    }
}
$single1 = new Single();
$single2 = new Single();
var_dump($single1);
var_dump($single2);
if ($single2 === $single1) {
    echo "是同一个对象";
} else {
    echo "不是同一个对象";
}
// object(Single)#1 (0) {
// }
// object(Single)#2 (0) {
// }
// 不是同一个对象
class Single2 {
    // 1.声明一个静态属性,用户保存类的实例
    public static $instance;
    //3. 将构函数私有化,避免外部new(每new一次,就不是同一个实例)
    private function __construct() {
    }
    // 2.声明一个静态的公共方法,用户外部调用本类的实例
    public static function getInstance() {
        if (!(self::$instance instanceof self)) {
            self::$instance = new self;
        }
        return self::$instance;
    }
    //3. 克隆函数私有化,避免外部clone(每clone一次,就不是同一个实例)
    private function __clone() {
    }
}
$singleDemo1 = Single2::getInstance();
$singleDemo2 = Single2::getInstance();
var_dump($singleDemo1->getInstance());
var_dump($singleDemo2->getInstance());
if ($singleDemo1 === $singleDemo2) {
    echo "是同一个对象";
} else {
    echo "不是同一个对象";
}
// object(Single2)#3 (0) {
// }
// object(Single2)#3 (0) {
// }
// 是同一个对象

ファクトリパターン

意味のある工場出荷時のパターン:
他のオブジェクトを生成するための責任を負う方法。これは、単純な記述ファクトリクラス、クラスまたはインスタンス化するために、他の方法です。
意義工場モード:
政治改革は、あなたは多くの変更を必要とするときに、同じクラスの多くの新しい削減するため、工場出荷時のパターンを使用することにより、このクラスが発生します。
コードは示しています。

<?php
class Factor
{
    public static function createDB()
    {
        echo '我生产了一个DB实例';
        return new DB;
    }
}
class DB
{
    public function __construct()
    {
        echo __CLASS__ . PHP_EOL;
    }
}
$db = Factor::createDB();

登録ツリーパターン

登録の数を意味:
私たちが使用する必要がある場合、登録ツリーは、プール内のオブジェクトに複数のオブジェクトを登録することで、あなたは、プールから直接取得することができます。

登録されたパターンの数の利点:
Singletonパターンを解決するには、アドレスに工場モデルは、メソッドが新しいことにより、オブジェクトのインスタンスを作成しない方法でプロジェクト全体の問題でオブジェクトの一意のインスタンスを作成する方法です。この問題を解決しようとレジストラの木パターン?この質問を検討する前に、我々は現在、対向する第1の二つのモデルの下での制限を考慮する必要があります。まず、プロセスは、オブジェクト自体の実施形態の固有モードを作成し、単一の決意がある、すなわち、物体が存在するかどうかを判断します。オブジェクトが存在返し、そのオブジェクトとリターンを作成し、存在しません。あなたは、インスタンスオブジェクトを作成するたびにその1裁判官が存在している必要があります。ファクトリモードより多くの考慮事項は、拡張、メンテナンスの問題です。一般的には、シングルトンと工場モードは、より合理的なターゲットを生成します。どのように簡単には、これらのオブジェクトを呼び出しますか?そして、このような落伍者の確立など、プロジェクト内のオブジェクトは、不便な全体的な管理の取り決めああが好き。そしてので、登録された木のパターンが出現しました。あなたはシングルトンや工場のパターンまたはその両方の組み合わせによって生成されたオブジェクトであるかどうか、私には全ての登録ツリー「へ」です。登録ツリーから直接アクセスするように見えるとき、私は、オブジェクトを使用します。これは、グローバル変数の私たちの利用が便利で実用的です。登録して、木のパターンは、他のモードのための非常に良いアイデアを提供します。
コードは示しています。

<?ph
/**
 * 单例模式
 */
class Single
{
    public static $attribute = '';
    public static $instance = '';
    private function __construct($attribute = '个人技术')
    {
        self::$attribute = $attribute;
    }
    public static function getInstance($attribute = '个人技术1')
    {
        if (!(self::$instance instanceof self)) self::$instance = new self($attribute);
        return self::$instance;
    }
}
/**
 * 工厂模式
 */
class Factory
{
    public static function createObj()
    {
        return Single::getInstance('个人技术');
    }
}
/**

 * 注册模式

 * 含义:就是将对象放在一个对象池中,使用的时候直接去对象池查找.

 * 需要如下几个操作:

 * 1.注册

 * 2.存放对象池

 * 3.获取

 * 4.销毁

 */
Class Register
{
    // 用一个数组来当做对象池,键当做对象别名,值存储具体对象
    public static $objTree = [];
    // 将对象放在对象池
    public static function set($key, $val)
    {
        return self::$objTree[$key] = $val;
    }
    // 通过对象别名在对象池中获取到对象别名
    public static function get($key)
    {
        return self::$objTree[$key];
    }
    // 通过对象别名将对象从对象池中注销
    public static function _unset($key)
    {
        unset(self::$objTree[$key]);
    }
}
Register::set('single', Factory::createObj());
$single = Register::get('single');
print_r($single);
echo $single::$attribute;

これは、マイクロチャネルのパブリック番号を切り替える夜遅くについて話をする何かを持ってリリース!

おすすめ

転載: www.cnblogs.com/qqblog/p/11817165.html