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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!