November 6, 2011

PHP - Design Patterns - Singleton & Registry

Hôm nay mình chia sẻ tới mọi người một khía cạnh khác trên blog cá nhân của mình - code PHP. Mình giới thiệu tới mọi người 2 mẫu design patterns rất phổ biến và đơn giản, đó là mẫu Singleton và mẫu Registry.
Singleton là mẫu thiết kế rất phổ biến trong OOP. Với singleton, sẽ hạn chế việc tạo nhiều thực thể trên cùng  một lớp đối tượng, mà thay vào đó nó sẽ cho phép chúng ta sử dụng chung một thực thể, hay nói một cách khác là dùng một shared instance. Việc này sẽ có lợi điểm cho bộ nhớ của hệ thống, không phải cứ phát sinh  đối tượng tùm lum ra.

Singleton:
<?php
class Singleton
{
    private static $_instance;
    protected function __contruct(){}
    public static function getInstance()
    {
        if (!isset (self::$_instance)) 
            self::$_instance = new self;
        return self::$_instance;
    {
}

Registry: Đây là một mẫu thiết kế cũng đơn giản và cũng rất phổ biến. Mẫu thiết kế này cung cấp một cơ chế để lưu trữ các giá trị toàn cục (global) một cách dễ quản lý hơn.
<?php
class Registry
{
    private static $_instance;
    private $_storage;
    protected function __construct(){}
    public static function getInstance()
    {
        if (!isset (self::$_instance)) 
            self::$_instance = new self;
        return self::$_instance;
    }
    // Xét giá trị thông qua magic call
    public function __set($name, $value)
    {
        $this->_storage[$name] = $value; 
    }
    // Lấy giá trị đã lưu thông qua magic call
    public function __get($name)
    {
        if (isset ($this->_storage[$name])) 
            return $this->_storage[$name];
        throw new Exception ('Không tìm thấy giá trị'); 
    }
    protected function __clone(){}
}

PHP - Design Pattern - Multiton & Factory

4 comments:

  1. anh ơi, anh có nhiều tài liệu về registry pattern không giúp em với. em đang làm báo cáo về php design pattern mà mấy cái tài liệu về registry ít quá, lại toàn tiếng Anh. e-mail của em là poweroflove_quang@yahoo.com, có gì anh share cho em một ít nhé

    ReplyDelete
  2. Chào em,
    Thật tế thì anh cũng không có, và cũng chỉ đọc từ trên mạng thôi. Và nếu em đang theo học mấy cái này, thì anh tin chắc "toàn tiếng Anh" là hoàn toàn đúng rồi, anh cũng đọc từ tiếng Anh và tóm tắt lại trên đây thôi.
    Còn về mẫu registry sao ít quá thì nói thật là nó chỉ có bấy nhiêu thôi. Design Pattern chỉ ngắn vậy thôi, nhưng tùy người phát triển mà sẽ có những hướng khác nhau.
    Chúc em thành công, thân.

    ReplyDelete
  3. Anh ơi! em đang bị mắc tại phần Registry pattern. Có tài liệu thì nói là sử dụng biến toàn cục để quản lý tốt hơn. Nhưng có tài liệu thì lại nói là cách tốt để hạn chế sử dụng biến toàn cục. Em đang làm code, kiểm tra đăng nhập thông qua các hàm có public để minh họa cho phần này. Anh cho em ý kiến được không ạ? Cám ơn anh rất nhiều!!!

    ReplyDelete
  4. Chào em,
    Biến toàn cục thì làm sao quản lý tốt được em. Em không nhớ mình đã khai báo chỗ nào, khai báo như thế nào, giá trị bao nhiêu luôn. Em hãy thử vào trang http://php.net tìm thử về global thì em sẽ nhận được 1 thông điệp khuyến cáo không nên dùng cái global nữa, và cái này tương lai sẽ bị hủy bỏ. Nếu tốt tại sao lại bỏ nhỉ :)
    PS: http://php.net là trang chính thống của PHP

    ReplyDelete