zoukankan      html  css  js  c++  java
  • php 实现设计模式之 享元模式

    <?php
    class Book{
    	public $title;
    	public $author;
    	
    	public function __construct($title,$author){
    		$this->author = $author;
    		$this->title = $title;
    	}
    	
    	public function getTitle(){
    		return $this->title;
    	}
    	
    	public function getAuthor(){
    		return $this->author;
    	}
    }
    
    class BookFactory{
    	public $books;
    	
    	public function add($book){
    		$this->books[] = $book;
    	}
    	
    	public function getBook($title){
    		if(empty($this->books[$title])){//建立title和book的对应关系。
    			$this->books[$title] = new Book($title, '李白');
    		}
    		return $this->books[$title];
    	}
    }
    
    class BookShelf{
    	public $shelf;
    	
    	public function add($book){
    		$this->shelf[] = $book;
    	}
    	
    	public function show(){
    		foreach ($this->shelf as $value){
    			echo '作者 :'.$value->getAuthor().'  标题:'.$value->getTitle();
    			echo "<br/>";
    		}
    	}
    }
    
    class Client{
    	public static function main(){
    		$obj = new BookFactory();
    		$shelf = new BookShelf();
    		
    		$book_1 = $obj->getBook('静夜思');
    		$book_2 = $obj->getBook('望天门山');
    		$book_3 = $obj->getBook('望庐山瀑布');
    		$book_4 = $obj->getBook('静夜思');//book4 服用的book1.
    		
    		if($book_1 === $book_4){
    			echo 'book1 is as the same as book4';
    		}
    		
    		$shelf->add($book_1);
    		$shelf->add($book_2);
    		$shelf->add($book_3);
    		
    		$shelf->show();
    		
    	}
    }
    
    Client::main();
    ?>
    

      UML类图如下:

    补充一个实例:

    <?php
    //一个产品有ISBN号和名字
    class Product{
    	public $ISBN;
    	public $name;
    }
    
    //享元类,提取出共性,同一个ISBN号对应的名字不会变,把这本书名字提取出来,放入享元对象,这样享元对象就存储了内蕴状态,外蕴状态是ISBN号码
    
    class Book{
    	public $name;
    	public function __construct($name){
    		$this->name = $name;
    	}
    	public function show(){
    		echo $this->name;
    	}
    	
    }
    
    
    //享元对象生产工厂,传入外蕴对象,返回对应的享元对象。
    class BookFactory{
    	public $books = array();
    	public function getBook($ISBN,$name){//维护一个对象池
    		if(!isset($this->books[$ISBN])){
    			$this->books[$ISBN] = new Book($name);
    		}
    		return $this->books[$ISBN];
    	}
    }
    
    $obj = new BookFactory();
    $book = $obj->getBook('1111','PHP高级程序设计');
    $book2 = $obj->getBook('1111','');
    $book2->show();
    ?>
    

      

  • 相关阅读:
    VS2010引用App_Code下的类文件问题解决方法
    Sql server 2008 sa用户开启教程
    ASP.NET中App_Code,App_Data等文件夹的作用
    错误提示: (provider: Named Pipes Provider, error: 40 Could not open a connection to SQL Server)
    treeview展开一个节点就关闭其他节点
    ASP.NET AJAX Toolkit的安装过程
    c++推荐读物
    for()的多参数
    模板函数I n p u t
    这次真的是下定决心了
  • 原文地址:https://www.cnblogs.com/taijun/p/4088396.html
Copyright © 2011-2022 走看看