Qua các series tự học về Design Pattern, Hôm nay cafedevn chia sẻ cho ace ví dụ và code cụ thể về cách sử dụng Flyweight design pattern với ngôn ngữ lập trình PHP. Nhằm giúp ace hiểu rõ cách sử Pattern này với PHP một cách nhanh nhất và áp dụng nó vào thực tế.

Mô tả code

Trong các trường hợp mẫu flyweight của một lớp giống hệt nhau được chia sẻ trong một triển khai thay vì tạo một instance mới của lớp đó cho mọi instance.

Điều này được thực hiện phần lớn để hỗ trợ hiệu suất và hoạt động tốt nhất khi một số lượng lớn các phiên bản giống hệt nhau của một lớp nếu không sẽ được tạo.

Trong ví dụ này, lớp FlyweightBook chỉ lưu trữ tác giả và tên sách, chỉ có ba tổ hợp tên tác giả có thể được sử dụng bởi hệ thống, tuy nhiên hệ thống có thể có một số lượng lớn sách trùng lặp.

FlyweightFactory chịu trách nhiệm phân phối các phiên bản của FlyweightBook và chỉ tạo một instance mới khi cần thiết.

Phần code

<?php

class FlyweightBook {
    private $author;
    private $title;    
    function __construct($author_in, $title_in) {
        $this->author = $author_in;
        $this->title  = $title_in;
    }      
    function getAuthor() {
        return $this->author;
    }    
    function getTitle() {
        return $this->title;
    }
}
 
class FlyweightFactory {
    private $books = array();     
    function __construct() {
        $this->books[1] = NULL;
        $this->books[2] = NULL;
        $this->books[3] = NULL;
    }  
    function getBook($bookKey) {
        if (NULL == $this->books[$bookKey]) {
            $makeFunction = 'makeBook'.$bookKey;
            $this->books[$bookKey] = $this->$makeFunction(); 
        } 
        return $this->books[$bookKey];
    }    
    //Sort of an long way to do this, but hopefully easy to follow.  
    //How you really want to make flyweights would depend on what 
    //your application needs.  This, while a little clumsy looking,
    //does work well.
    function makeBook1() {
        $book = new FlyweightBook('Larry Truett','PHP For Cats'); 
        return $book;
    }
    function makeBook2() {
        $book = new FlyweightBook('Larry Truett','PHP For Dogs'); 
        return $book;
    }
    function makeBook3() {
        $book = new FlyweightBook('Larry Truett','PHP For Parakeets'); 
        return $book;
    }
}
 
class FlyweightBookShelf {
    private $books = array();
    function addBook($book) {
        $this->books[] = $book;
    }    
    function showBooks() {
        $return_string = NULL;
        foreach ($this->books as $book) {
            $return_string .= 'title: "'.$book->getAuthor().'  author: '.$book->getTitle();"
        };
        return $return_string;
    }
}

  writeln('BEGIN TESTING FLYWEIGHT PATTERN');
 
  $flyweightFactory = new FlyweightFactory();
  $flyweightBookShelf1 =  new FlyweightBookShelf();
  $flyweightBook1 = $flyweightFactory->getBook(1);
  $flyweightBookShelf1->addBook($flyweightBook1);
  $flyweightBook2 = $flyweightFactory->getBook(1);
  $flyweightBookShelf1->addBook($flyweightBook2);
 
  writeln('test 1 - show the two books are the same book');
  if ($flyweightBook1 === $flyweightBook2) {
     writeln('1 and 2 are the same');
  } else {
     writeln('1 and 2 are not the same');    
  }
  writeln('');

  writeln('test 2 - with one book on one self twice');
  writeln($flyweightBookShelf1->showBooks());
  writeln('');

  $flyweightBookShelf2 =  new FlyweightBookShelf(); 
  $flyweightBook1 = $flyweightFactory->getBook(2);  
  $flyweightBookShelf2->addBook($flyweightBook1);
  $flyweightBookShelf1->addBook($flyweightBook1);

  writeln('test 3 - book shelf one');
  writeln($flyweightBookShelf1->showBooks());
  writeln('');

  writeln('test 3 - book shelf two');
  writeln($flyweightBookShelf2->showBooks());
  writeln('');

  writeln('END TESTING FLYWEIGHT PATTERN');
 
  function writeln($line_in) {
    echo $line_in."<br/>";
  }

?>

Kết quả:

BEGIN TESTING FLYWEIGHT PATTERN

test 1 - show the two books are the same book
1 and 2 are the same

test 2 - with one book on one self twice
title: "Larry Truett author: PHP For Cats"
title: "Larry Truett author: PHP For Cats"

test 3 - book shelf one
title: "Larry Truett author: PHP For Cats"
title: "Larry Truett author: PHP For Cats"
title: "Larry Truett author: PHP For Dogs"

test 3 - book shelf two
title: "Larry Truett author: PHP For Dogs"


END TESTING FLYWEIGHT PATTERN

Cài ứng dụng cafedev để dễ dàng cập nhật tin và học lập trình mọi lúc mọi nơi tại đây.

Tài liệu từ cafedev:

Nếu bạn thấy hay và hữu ích, bạn có thể tham gia các kênh sau của cafedev để nhận được nhiều hơn nữa:

Chào thân ái và quyết thắng!

Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you!