本文為翻譯文章
原文網址:Design Patterns in PHP 如果打算學習php的童鞋可以參考下筆者的程式語言學習知識體係要點列表
本文主要討論下web開發中,準確而言,是php開發中的相關的設計模式及其應用。有經驗的開發者肯定對於設計模式非常熟悉,但是本文主要是針對那些初級的開發者。首先我們要搞清楚到底什麼是設計模式,設計模式並不是用來解釋的模式,它們並不是像鍊錶那樣的常見的資料結構,也不是某種特殊的應用或框架設計。事實上,設計模式的解釋如下:
descriptions of communicating objects and classes that are customized to solve a general design problem in a particular context.
另一方面,設計模式提供了一種廣泛的可重用的方式來解決我們日常程式設計中常常遇見的問題。設計模式並不一定就是一個類別庫或第三方框架,它們更多的表現為一種想法並且廣泛地應用在系統中。它們也表現為一種模式或模板,可以在多個不同的場景下用於解決問題。設計模式可以用於加速開發,並且將許多大的想法或設計以簡單地方式實現。當然,雖然設計模式在開發中很有作用,但是千萬要避免在不適當的場景誤用它們。
目前常見的設計模式主要有23種,依使用目標的差異可以分為以下三大類:
建立模式:用於建立物件從而將某個物件從實作中解耦合。
架構模式:用於在不同的物件之間建構大的物件結構。
行為模式:用於在不同的物件之間管理演算法、關係以及職責。
Creational Patterns
Singleton(單例模式)
單例模式是最常見的模式之一,在Web應用的開發中,常用於允許在執行時間為某個特定的類別建立一個可存取的實例。
-
/**
- * 單例類別
- */
- final class Product
- {
-
- /**
- * @var self
- */
- private static $instance;
-
- /**
- * @var 混合
- */
- public $mix;
-
-
- /**
- * 回傳自身實例
- *
- * @return self
- */
- public static function getInstance() {
- if (!(self::$instance instanceof self)) {
- self::$instance = new self();
- }
- return self: :$instance;
- }
-
- private function __construct() {
- }
-
- private function __clone() {
- }
- private function __clone() {
- }
- > $firstProduct = Product::getInstance();
- $secondProduct = Product::getInstance();
-
- $firstProduct->mix = 'test';
- $secondProduct->mix = '0 ';
-
- print_r($firstProduct->mix);
- // example
- print_r($secondProduct->mix);
- // example
複製程式碼
在許多情況下,需要為系統中的多個類別建立單例的構造方式,這樣,可以建立一個通用的抽象父工廠方法:
-
- abstract class FactoryAbstract {
-
- protected static $instances = array();
-
- public instances = array();
-
- public static function(Ingetst); 🎜> $className = static::getClassName();
- if (!(self::$instances[$className] instanceof $className)) {
- self::$instances[$className] = new $className ();
- }
- return self::$instances[$className];
- }
-
- public static function removeInstance() {
- $className = static::getClassName() ;
- if (array_key_exists($className, self::$instances)) {
- unset(self::$instances[$className]);
- }
- }
- final🎜> final🎜> final🎜> final🎜> final🎜> final🎜> final🎜> final🎜> final🎜> final🎜> final🎜> final🎜> final🎜> final🎜> final🎜> final🎜> final🎜> final🎜> final protected static function getClassName() {
- return get_called_class();
- }
-
- protected function __construct() { }
-
- final protected function protect(
-
- abstract class Factory extends FactoryAbstract {
-
- final public static function getInstance() {
- return parent::getInstance();
- }
- return parent::getInstance();
- }
- function removeInstance() {
- parent::removeInstance();
- }
- }
- // using:
-
- class FirstProduct extends Factory {
-
- class FirstProduct extends Factory {
- public $🎜> ;
- }
- class SecondProduct extends FirstProduct {
- }
-
- FirstProduct::getInstance()->a[] = 1;
- SecondProduct::getgetstance()->( ] = 2;
- FirstProduct::getInstance()->a[] = 3;
- SecondProduct::getInstance()->a[] = 4;
-
- print_r(FirstProduct::getInstance ()->a);
// array(1, 3) print_r(SecondProduct::getInstance()->a); // array(2, 4)
複製程式碼Registry
註冊台模式並不是很常見,它也不是一個典型的創建模式,只是為了利用靜態方法更方便的存取資料。
-
/**
- * 註冊表類
- */
- class Package {
-
- protected static $data = array();
-
- public static function set($key, $value) {
- self::$data[$key] = $value;
- }
-
- public static function get($ key) {
- return isset(self::$data[$key]) ? self::$data[$key] : null;
- }
-
- final public static function removeObject($key ) {
- if (array_key_exists($key, self::$data)) {
- unset(self::$data[$key]);
- }
- }
- }
-
-
- Package::set('name', 'Package name');
-
- print_r(Package::get('name'));
- // Package name
複製程式碼
Factory(工廠模式)
工廠模式是另一種非常常用的模式,正如其名字所示:確實是物件實例的生產工廠。在某些意義上,工廠模式提供了通用的方法有助於我們去獲取對象,而不需要關心其具體的內在的實現。
- interface Factory {
- public function getProduct();
- }
- public function getProduct();
- }
- face public function getName();
- }
-
- class FirstFactory implements Factory {
-
- public function getProduct() {
- return newProduct();
- >}
-
- class SecondFactory implements Factory {
-
- public function getProduct() {
- return new SecondProduct();
- }
- return new SecondProduct();
- }
- > implements Product {
-
- public function getName() {
- return 'The first product';
- }
- }
-
- class SecondProduct imple🎜>}
-
- class SecondProduct implelments Product> public function getName() {
- return 'Second product';
- }
- }
-
- $factory = new FirstFactory();
- $firstProduct = $factory = new FirstFactory();
- $firstProduct = $factory-getProduct(actory) ;
- $factory = new SecondFactory();
- $secondProduct = $factory->getProduct();
-
- print_r($firstProduct->getName());
- print_r($firstProduct->getName());
- // The first product
- print_r($secondProduct->getName());
// Second product
複製程式碼
AbstractFactory(抽象工廠模式)
有些情況下我們需要根據不同的選擇邏輯提供不同的構造工廠,而對於多個工廠而言需要一個統一的抽象工廠:
interface Command { function onCommand($name, $args);- }
-
-
- class CommandChain {
- private $_commands = array();
-
- public function addCommand($cmd) {
- $this->_commands[]= $cmd;
- }
- }
-
- public function runCommand($name, $args) {
- foreach($this->_commands as $cmd) {
- if ($cmd->onCommand($name, $args))
- return ;
- }
- }
- }
-
- class CustCommand implements Command {
- public function onCommand($name, $args) {
- if ($name != 'addCustomer' )
- return false;
- echo("This is CustomerCommand handling 'addCustomer'n");
- return true;
- }
- }
-
- class Command
- public function onCommand($name, $args) {
- if ($name != 'mail')
- return false;
- echo("This is MailCommand handling 'mail'n");
- return true;
- }
- }
-
- $cc = new CommandChain();
- $cc->addCommand( new CustCommand());
- $cc->addCommand ( new MailCommand());
- $cc->runCommand('addCustomer', null);
- $cc->runCommand('mail', null);
-
-
複製程式碼
|