原文連結:http://www.cnblogs.com/siqi/archive/2012/09/09/2667562.html
1.單例模式
實例。作為物件的建立模式, 單例模式確保某一個類別只有一個實例,而且自行實例化並向整個系統提供這個實例。
1. php的應用主要在於
/**
* 設計模式之單例模式
* $_instance必須宣告為靜態的私有變數
* 建構子必須宣告為私人()方法必須設定為公有的,必須呼叫此方法以傳回實例的一個引用
* ::運算子只能存取靜態變數和靜態函數
* new物件都會消耗記憶體
* 使用場景:最常用的地方是資料庫連線。
* 使用單例模式產生一個物件後,該物件可以被其它眾多物件所使用。
*/
class man{
// ; //建構子宣告為private,防止直接建立物件 private
function __construct() { '; } //單例方法
public static
var_dump
(isset(self::$_instance)); if(!isset(self::$_instance
))
{ } return self::$_instance;
}
//阻止使用者複製物件實例 private function __clone()
not allow' ,
E_USER_ERROR); } function
test()
function test()
echo
("test"); }}/// ample類別的單例物件
$test = man::get_instance();$test = man::get_instance();
$test->test();();
$test->test();
一個E_USER_ERROR.//$test_clone = clone $test;
2。類別中實作
②繼承自抽象基底類別的子類別:實作基底類別中的抽象方法
③工廠類別:用以實例化所有相對應的子類別
③工廠類別:以實例化所有相對應的子類別
/**
*
*
*/
abstract
class Operation{ //
//無法包含函數體 abstract public function getValue(/$num1,function getValue(/$num1,function getValue(/$num1🜎 }
/*
* * 加法類
*/
public
function getValue($num1,$num2
){ +$num2; } }
*/ class OperationSub extends Operation {
,
$num2){ return
$num1🎠 } /*
* * 乘法類別 Operation {
public function getValue($num1 turn $num1*$num2
; } } 除法類別 */
class
OperationDiv ext function getValue($num1
,
$num2){ (
$ num2==0){ throw
}else { } } catch (Exception
$e){ } } }
透過採用物件導向的繼承特性,我們可以很容易就能對原有程式進行擴展,例如:'乘方','開方','對數','三角函數','統計'等,以還可以避免載入沒有必要的程式碼。
如果我們現在需要增加一個求餘的類,會非常的簡單
我們只需要另外寫一個類(該類繼承虛擬基類),在類中完成相應的功能(比如:求乘方的運算),而且大幅降低了耦合度,方便的日後維護及擴充
/*
*/
class OperationRem extends
Operation { public function
return $num1%$num12; }
現在還有一個問題未解決,就是如何讓程式根據使用者輸入的操作符實例化對應的物件呢? 解決方法:使用一個單獨的類別來實現實例化的過程,這個類別就是工廠
* 功能:根據輸入的運算符號,工廠就能實例化出適合的物件
*
*/
function createObj($operate){
switch ($operate){ 其他關於此模式的筆記: 工廠模式: 觀察者模式屬於行為模式,是定義對象間的一種一對多的依賴關係,以便當一個對象的狀態發生改變時,所有依賴它的物件都被通知並自動刷新。它完美的將觀察者對象和被觀察者對象分開。可以在獨立的物件(主體)中維護一個對主體感興趣的依賴項(觀察器)清單。 讓所有觀察器各自實現公共的 Observer 接口,以取消主體和依賴性物件之間的直接依賴關係。 (反正我看不明白)
case
'+':🎠
new OperationAdd();
return
new OperationSub(); break; case '*':
return new OperationSub();
break;
case '/': return
new OperationDiv();
break; }
} }:: $result=$test
->getValue(23,0); echo
$ result;
以交通工具為例子:要求請既可以定制交通工具,又可以定制交通工俱生產的過程
1>定制交通工具
1.定義一個接口,內含交工工具的方法(啟動運行停止)
2.讓飛機,汽車等類去實現他們
2> 定制工廠(通上類似)一個接口,裡麵包含交工工具的製造方法(啟動運行停止)
2.分別寫製造飛機,汽車的工廠類別去繼承實現這個接口
) { echo __CLASS__ . ' - ' . $subjectMy
implements SplObserver { public function update(SplSubject
$subject
) {
echo __CLASS__ . ' - ' . $subject
->getName( MySubject implements SplSubject { private $_observers
; private $_name; public
function
__construct($name SplObjectStorage();
$this->_name = $name ; }
public function attach(SplObserver
$observer¦ $observer); } public
function detach(SplObserver $observer) {
$this->_observers->detach($observer); () {
foreach
($this->_observers as $observer) {
$observer->update public
function
getName() { return $this->_name; }
}$observer1 = new
MyObserver1();
$observer2 new MySubject("test");
$subject ->attach($observer1);$subject->attach($observer2);
參考原文:http://www.php.net/manual/zh/class.splsubject.php
策略4.模式模式在此模式中,
演算法是從複雜類別中提取的,因而可以方便地替換。例如,如果要變更搜尋引擎中排列頁的方法,則策略模式是一個不錯的選擇。思考一下搜尋引擎的幾個部分 —— 一部分遍歷頁面,一部分對每頁排列,另一部分則是根據排列的結果排序。在複雜的範例中,這些部分都在同一個類別中。透過使用策略模式,您可將排列部分放入另一個類別中,以便變更頁排列的方式,而不會影響搜尋引擎的其餘程式碼。
作為一個較簡單的示例,下面顯示了一個用戶列表類,它提供了一個根據一組即插即用的策略查找一組用戶
一組即插即用的策略。 //定義介面interface IStrategy {
function filter($record); FindAfterStrategy
implements
IStrategy { private $_name; public
function __construct($name) ; }
public function filter($record ) {
return strcmp (
$this
->_name, $record); 實作介面方式1class RandomStrategy implements
IStrategy { public function filter($record) { return
return
1.
}}//主類class UserList {
private $_list = array ();
public . if
(
$names
!= null) { ( $names as
$name ) { } } }
) { $this->_list [] = $name;
$filter) { $recs = array ();
foreach ( $this->_list as $user ) {
)) $recs [] = $user
;
}
return
$recs; array ( "Andy",
"Jack", "Jack", ) );
$f1
=
$ul->find ( new FindAfterStrategy ( "J )$ FindAfterStrategy ( "J" )$); $f2
= $ul ->find ( new RandomStrategy () );
print_r (
$f2 ); 高的彈性
以上就介紹了php 設計模式(轉載),包含了面向的內容,希望對PHP教學有興趣的朋友有幫助。