PHP設計模式學習筆記: 享元模式(flyweight)

jopen 10年前發布 | 12K 次閱讀 PHP設計模式 PHP開發

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