1. 程式人生 > >PHP 單例模式 工廠模式 策略模式程式碼理解

PHP 單例模式 工廠模式 策略模式程式碼理解

//單個類 單例
<?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); //坐巴士去