• 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();
    ?>
    

      

  • 相关阅读:
    5、依赖倒转原则
    4、开放-封闭原则
    3、单一职责原则
    2013年工作生活总结
    2、策略模式
    1、简单工厂模式
    Unity3D笔记四 基础知识概念
    PythonStudy——PyCharm使用技巧 Column Selection Mode(列选择模式)
    PythonStudy——函数对象的案例
    PythonStudy——函数嵌套定义 Function nesting definition
  • 原文地址:https://www.cnblogs.com/taijun/p/4088396.html
Copyright © 2020-2023  润新知