設計模式(Design pattern)代表了最佳的實踐,通常被有經驗的面向對象的軟件開發人員所採用。設計模式是軟件開發人員在軟件開發過程中面臨的一般問題的解決方案。這些解決方案是衆多軟件開發人員經過相當長的一段時間的試驗和錯誤總結出來的。
1.單例模式
單例模式(Singleton Pattern)是最簡單的設計模式之一。這種類型的設計模式屬於創建型模式,它提供了一種創建對象的最佳方式。
這種模式涉及到一個單一的類,該類負責創建自己的對象,同時確保只有單個對象被創建。這個類提供了一種訪問其唯一的對象的方式,可以直接訪問,不需要實例化該類的對象。
<?php
//單例模式
class Singleton {
private $runtime;
private static $instance;
private function __construct() {
$this->runtime = time();
}
public static function getInstance() {
if(!(self::$instance instanceof self)) {
self::$instance = new self();
}
return self::$instance;
}
public function run() {
echo $this->runtime,PHP_EOL;
}
private function __clone() {
}
public function __destruct() {
}
}
$a = Singleton::getInstance();
$a->run();
$b = Singleton::getInstance();
$b->run();
$c = Singleton::getInstance();
$c->run();
2.工廠模式
工廠模式(Factory Pattern)是最常用的設計模式之一。這種類型的設計模式屬於創建型模式,它提供了一種創建對象的最佳方式。
在工廠模式中,我們在創建對象時不會對客戶端暴露創建邏輯,並且是通過使用一個共同的接口來指向新創建的對象。
<?php
//工廠模式
abstract class Operation {
abstract public function getValue($num1, $num2);
}
class OperationAdd extends Operation {
public function getValue($num1, $num2) {
return $num1 + $num2;
}
}
class OperationSub extends Operation {
public function getValue($num1, $num2) {
return $num1 - $num2;
}
}
class Factory {
public static function createObj($operate) {
switch ($operate) {
case '+':
return new OperationAdd();
break;
case '-':
return new OperationSub();
break;
}
}
}
$test = Factory::createObj('+');
echo $test->getValue(2, 3);
3.註冊模式
<?php
//註冊模式
//創建單例
class Single{
public $hash;
static protected $ins=null;
final protected function __construct(){
$this->hash=rand(1,9999);
}
static public function getInstance(){
if (self::$ins instanceof self) {
return self::$ins;
}
self::$ins=new self();
return self::$ins;
}
}
//工廠模式
class RandFactory{
public static function factory(){
return Single::getInstance();
}
}
//註冊樹
class Register{
protected static $objects;
public static function set($alias,$object){
self::$objects[$alias]=$object;
}
public static function get($alias){
return self::$objects[$alias];
}
public static function _unset($alias){
unset(self::$objects[$alias]);
}
}
Register::set('rand',RandFactory::factory());
$object=Register::get('rand');
print_r($object);
4.適配器模式
適配器模式(Adapter Pattern)是作爲兩個不兼容的接口之間的橋樑。這種類型的設計模式屬於結構型模式,它結合了兩個獨立接口的功能。
這種模式涉及到一個單一的類,該類負責加入獨立的或不兼容的接口功能。舉個真實的例子,讀卡器是作爲內存卡和筆記本之間的適配器。您將內存卡插入讀卡器,再將讀卡器插入筆記本,這樣就可以通過筆記本來讀取內存卡。
<?php
//適配器模式
//目標角色
interface Target {
public function simpleMethod1();
public function simpleMethod2();
}
//源角色class Adaptee {
public function simpleMethod1(){
echo 'Adapter simpleMethod1'."<br>";
}
}
//類適配器角色
class Adapter implements Target {
private $adaptee;
function __construct(Adaptee $adaptee) {
$this->adaptee = $adaptee;
}
//委派調用Adaptee的sampleMethod1方法
public function simpleMethod1(){
echo $this->adaptee->simpleMethod1();
}
public function simpleMethod2(){
echo 'Adapter simpleMethod2'."<br>";
}
}
//客戶端
class Client {
public static function main() {
$adaptee = new Adaptee();
$adapter = new Adapter($adaptee);
$adapter->simpleMethod1();
$adapter->simpleMethod2();
}
}
Client::main();
5.觀察者模式
當對象間存在一對多關係時,則使用觀察者模式(Observer Pattern)。比如,當一個對象被修改時,則會自動通知依賴它的對象。觀察者模式屬於行爲型模式。
<?php
//觀察者模式
// 主題接口
interface Subject{
public function register(Observer $observer);
public function notify();
}
// 觀察者接口
interface Observer{
public function watch();
}
// 主題
class Action implements Subject{
public $_observers=array();
public function register(Observer $observer){
$this->_observers[]=$observer;
}
public function notify(){
foreach ($this->_observers as $observer) {
$observer->watch();
}
}
}
// 觀察者
class Cat implements Observer{
public function watch(){
echo "Cat watches TV<hr/>";
}
}
class Dog implements Observer{
public function watch(){
echo "Dog watches TV<hr/>";
}
}
class People implements Observer{
public function watch(){
echo "People watches TV<hr/>";
}
}
// 應用實例
$action=new Action();
$action->register(new Cat());
$action->register(new People());
$action->register(new Dog());
$action->notify();