PHP設計模式學習筆記: 享元模式(flyweight)
不知道為什么把flyweight翻譯成享元,還有一般的應用場景在哪里?數據庫?那跟單例模式比較呢?
// 享元的書對象 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]; } function makeBook1() { $book = new FlyweightBook('JK羅琳','哈利波特與魔法石'); return $book; } function makeBook2() { $book = new FlyweightBook('JK羅琳','哈利波特與混血王子'); return $book; } function makeBook3() { $book = new FlyweightBook('JK羅琳','哈利波特與阿茲卡班的囚徒'); 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 .= '標題: '.$book->getAuthor().' 作者: '.$book->getTitle(); }; return $return_string; } } writeln('開始測試享元模式'); $flyweightFactory = new FlyweightFactory(); $flyweightBookShelf1 = new FlyweightBookShelf();// 制作一個新書架1 $flyweightBook1 = $flyweightFactory->getBook(1); // 從工廠創建書1 $flyweightBookShelf1->addBook($flyweightBook1); // 把書1放到書架1 $flyweightBook2 = $flyweightFactory->getBook(1); // 從工廠獲取書1 $flyweightBookShelf1->addBook($flyweightBook2); // 把書2(其實就是書1)放到書架1, 這時候書架1上有兩本書1 writeln('測試 1 - 兩本書是否是同一本書'); if ($flyweightBook1 === $flyweightBook2) { writeln('1 和 2 是一樣的'); } else { writeln('1 和 2 是不一樣的'); } writeln(''); writeln('測試 2 - 一本書在同一個書架上出現兩次'); writeln($flyweightBookShelf1->showBooks()); writeln(''); $flyweightBookShelf2 = new FlyweightBookShelf();// 制作一個新書架2 $flyweightBook1 = $flyweightFactory->getBook(2); // 從工廠創建書2 $flyweightBookShelf2->addBook($flyweightBook1); // 把書2放到書架2 $flyweightBookShelf1->addBook($flyweightBook1); // 把書2放到書架1 writeln('測試 3 - 書架1'); writeln($flyweightBookShelf1->showBooks()); // 打印出了書架1上的兩本書,書1 writeln(''); writeln('測試 3 - 書架2'); writeln($flyweightBookShelf2->showBooks()); // 打印出了書架2上的一本書,書2 writeln(''); writeln('結束測試享元模式'); function writeln($line_in) { echo $line_in.PHP_EOL; }結果
開始測試享元模式 測試 1 - 兩本書是否是同一本書 1 和 2 是一樣的 測試 2 - 一本書在同一個書架上出現兩次 標題: JK羅琳 作者: 哈利波特與魔法石標題: JK羅琳 作者: 哈利波特與魔法石 測試 3 - 書架1 標題: JK羅琳 作者: 哈利波特與魔法石標題: JK羅琳 作者: 哈利波特與魔法石標題: JK羅琳 作者: 哈利波特與混血王子 測試 3 - 書架2 標題: JK羅琳 作者: 哈利波特與混血王子 結束測試享元模式
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!