php設計模式有如下
備忘錄模式(Memento模式)
觀察者模式(Observer模式)
模板方法模式(Template Method模式)
命令模式(command模式)
合成模式(composite模式)
享元模式(flyweight模式)
策略模式(strategy模式)
狀態模式(state模式)
適配器模式(adapter模式)
工廠方法模式(factory method模式)
原型模式(prototype模式)
門面模式(facade模式)
單例模式(singleton模式)
橋梁模式(bridge模式)
裝飾器模式(decorator模式)
抽象工廠模式(abstract factory模式)
建造者模式(Builder模式)
訪問者模式(Visitor模式)
當你在不斷的試圖從你的應用程序中發現新的特征時,你是否發現你提出的解決方法和一些以前你已經實現的東西是如此的類似呢?如果你是一個程序員(即使你才開始很短的時間),你都可能回答“是”。這看起來就是你使用了一些以前的代碼來解決軟件開發過程中新發現的問題了。你可能已經認識到:你的解決方法是基本原理,是一個不僅僅是你而且是所有專業開發者都能廣泛重復應用的方法。
事實上,許多程序問題都不斷的反復的遇到,而且許多用來解決這些問題的基本方法(或者說是設計模式)都已經浮現出來。設計模式就是一個教你如何利用真實可靠的設計來組織你的代碼的模板。
設計模式歷史
“設計模式”這個術語最初被設計用於建築學領域。Christopher Alexander 在他1977的著作“A Pattern Language:Towns/Building/Construction”裡面描述了一些常見的建築學設計問題,並解釋了如何用這些已有的,著名的模式集合來開始全新的有效的設計。Alexander的觀點被很好的轉化到軟件開發上來,並且長期的用原有的組件來構造新的解決方案。
所有的設計模式都有一些常用的特性:一個標識(a name),一個問題陳述(a problem statement)和一個解決方案(a solution)。
1、一個設計模式的標識是重要的,因為它會讓其他的程序員不用進行太深入的學習就能立刻理解你的代碼的目的(至少通過這個標識程序員會很熟悉這個模式)。
2、問題描述是用來說明這個模式的應用的領域。
3、解決方案描述了這個模型的執行。一個好的設計模式的論述應該覆蓋使用這個模型的優點和缺點。
一個模式是解決特定問題的有效方法。一個設計模式不是一個庫(能在你的項目中直接包含和使用的代碼庫)而是一個用來組織你的代碼的模板。事實上,一個代碼庫和一個設計模式在應用上是有很多不同的。
比如,你從店鋪裡面買的一件襯衫是一個代碼庫,它的顏色,樣式和大小都由設計師和廠商決定,但它滿足了你的需求。然而,如果店裡面沒有什麼衣服適合你,那你就能自己創建自己的襯衫(設計它的形狀,選擇布料,然後裁縫在一起)。但是如果你不是一個裁縫,你可能會發現自己很容易的去找一個合適的模式然後按著這個模式去設計自己的襯衫。使用一個模型,你可以在更少的時間內得到一個熟練設計的襯衫。
回到討論軟件上來,一個數據提取層或者一個CMS(content management system)就是一個庫,它是先前設計好而且已經編碼好了的,如果它能准確的滿足你的需要那它就是一個好的選擇。
工廠模式
工廠模式(Factory)允許你在代碼執行時實例化對象。它之所以被稱為工廠模式是因為它負責“生產”對象。工廠方法的參數是 你要生成的對象對應的類名稱。
代碼如下 復制代碼Example #1 調用工廠方法(帶參數)
<?php
class Example
{
// The parameterized factory method
public static function factory($type)
{
if (include_once 'Drivers/' . $type . '.php') {
$classname = 'Driver_' . $type;
return new $classname;
} else {
throw new Exception ('Driver not found');
}
}
}
?>
按上面的方式可以動態加載drivers。如果Example類是一個數據庫抽象類,那麼 可以這樣來生成MySQL和 SQLite驅動對象:
<?php
// Load a MySQL Driver
$mysql = Example::factory('MySQL');
// Load a SQLite Driver
$sqlite = Example::factory('SQLite');
?>
單例
單例模式(Singleton)用於為一個類生成一個唯一的對象。最常用的地方是數據庫連接。 使用單例模式生成一個對象後,該對象可以被其它眾多對象所使用。
Example #2 單例模式
<?php
class Example
{
// 保存類實例在此屬性中
private static $instance;
// 構造方法聲明為private,防止直接創建對象
private function __construct()
{
echo 'I am constructed';
}
// singleton 方法
public static function singleton()
{
if (!isset(self::$instance)) {
$c = __CLASS__;
self::$instance = new $c;
}
return self::$instance;
}
// Example類中的普通方法
public function bark()
{
echo 'Woof!';
}
// 阻止用戶復制對象實例
public function __clone()
{
trigger_error('Clone is not allowed.', E_USER_ERROR);
}
}
?>
這樣我們可以得到一個獨一無二的Example類的對象。
<?php
// 這個寫法會出錯,因為構造方法被聲明為private
$test = new Example;
// 下面將得到Example類的單例對象
$test = Example::singleton();
$test->bark();
// 復制對象將導致一個E_USER_ERROR.
$test_clone = clone $test;
?>
最後一個想法:就象一個裁縫模型,一個設計本身而言是沒有什麼用處的。畢竟,你不可能穿一個服裝模型,它僅僅是由很薄的紙拼湊起來的。類似的,一個軟件設計模型也僅僅只是一個引導。它必須根據程序設計語言和你的應用程序的特點和要求而特別的設計。