PHP 單例模式 工廠模式 策略模式程式碼理解
阿新 • • 發佈:2018-12-31
//單個類 單例 <?php /** *單例模式:一個類只能有一個物件 *三私一公 */ class MySQLDB { private static $instance; //私有的成員用來儲存類的例項 private function __construct() { //私有的建構函式阻止在類的外部例項化 } private function __clone() { //私有的__clone()阻止clone物件 } public static function getInstance() { //公有的方法用來獲取類的例項 if(!self::$instance instanceof self ) self::$instance=new self; return self::$instance; } } $db1=MySQLDB::getInstance(); $db2=MySQLDB::getInstance(); var_dump($db1,$db2); //專案層面單例封裝 <?php class DB1 { } class DB2 { } class DB3 { } function getInstance($db_name) { static $array=array(); //通過陣列來儲存類的單例 if(!isset($array[$db_name])) $array[$db_name]=new $db_name; return $array[$db_name]; } $db1=getInstance('DB1'); $db2=getInstance('DB2'); $db3=getInstance('DB3'); var_dump($db1,$db2,$db3); //object(DB1)#1 (0) { } object(DB2)#2 (0) { } object(DB3)#3 (0) { } //=========工廠模式 <?php header('content-type:text/html;charset=utf-8'); abstract class Product { abstract public function getName(); } class ProductA extends Product { public function getName() { echo '這是A商品<br>'; } } class ProductB extends Product { public function getName() { echo '這是B商品<br>'; } } //工廠模式 class ProductFactory { public static function create($num) { switch($num) { case 1: return new ProductA(); case 2: return new ProductB(); } return null; } } //傳遞不同的引數獲取不同的物件 $obj=ProductFactory::create(1); $obj->getName(); //這是A商品 $obj=ProductFactory::create(2); $obj->getName(); //這是B商品 //=======策略模式 <?php header('content-type:text/html;charset=utf-8'); interface IStrategy { function ontheway(); } class Walk implements IStrategy { public function ontheway() { echo '走著去<br>'; } } class Bick implements IStrategy { public function ontheway() { echo '騎自行車去<br>'; } } class Bus implements IStrategy { public function ontheway() { echo '坐巴士去<br>'; } } //策略模式,傳遞不同的引數,呼叫不同的策略 class Strategy{ public function getWay(IStrategy $obj) { $obj->ontheway(); } } $obj=new Strategy(); $obj->getWay(new Walk); //走著去 $obj->getWay(new Bick); //騎自行車去 $obj->getWay(new Bus); //坐巴士去