單例模式
單例模式顧名思義,就是只有一個(gè)實(shí)例。作為對(duì)象的創(chuàng)建模式, 單例模式確保某一個(gè)類只有一個(gè)實(shí)例,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例。php的應(yīng)用主要在于數(shù)據(jù)庫(kù)應(yīng)用, 一個(gè)應(yīng)用中會(huì)存在大量的數(shù)據(jù)庫(kù)操作, 在使用面向?qū)ο蟮姆绞介_(kāi)發(fā)時(shí), 如果使用單例模式, 則可以避免大量的new 操作消耗的資源。
/**
* 設(shè)計(jì)模式之單例模式
* $_instance必須聲明為靜態(tài)的私有變量
* 構(gòu)造函數(shù)必須聲明為私有,防止外部程序new類從而失去單例模式的意義
* getInstance()方法必須設(shè)置為公有的,必須調(diào)用此方法以返回實(shí)例的一個(gè)引用
* ::操作符只能訪問(wèn)靜態(tài)變量和靜態(tài)函數(shù)
* new對(duì)象都會(huì)消耗內(nèi)存
* 使用場(chǎng)景:最常用的地方是數(shù)據(jù)庫(kù)連接。
* 使用單例模式生成一個(gè)對(duì)象后,該對(duì)象可以被其它眾多對(duì)象所使用。
*/
class one
{
//保存例實(shí)例在此屬性中
private static $_instance;
//構(gòu)造函數(shù)聲明為private,防止直接創(chuàng)建對(duì)象
private function __construct()
{
echo '我被實(shí)例化了!';
}
//單例方法
public static function get_instance()
{
var_dump(isset(self::$_instance));
if(!isset(self::$_instance))
{
self::$_instance=new self();
}
return self::$_instance;
}
function test()
{
echo("test");
}
}
// 這個(gè)寫(xiě)法會(huì)出錯(cuò),因?yàn)闃?gòu)造方法被聲明為private
//$test = new one();
// 下面將得到one類的單例對(duì)象
$object = one::get_instance();
$object->test();
單例模式的要點(diǎn)有三個(gè):
1.一是某個(gè)類只能有一個(gè)實(shí)例;
2.二是它必須自行創(chuàng)建這個(gè)實(shí)例;
3.三是它必須自行向整個(gè)系統(tǒng)提供這個(gè)實(shí)例。
工廠模式
抽象基類:類中定義一些抽象方法,用以在子類中實(shí)現(xiàn);
繼承自抽象基類的子類:實(shí)現(xiàn)基類中的抽象方法;
工廠類:用以實(shí)例化所有相對(duì)應(yīng)的子類;

/**
*
* 定義個(gè)抽象的類,讓子類去繼承實(shí)現(xiàn)它
*
*/
abstract class Operation{
//抽象方法不能包含函數(shù)體
abstract public function getValue($num1,$num2);//強(qiáng)烈要求子類必須實(shí)現(xiàn)該功能函數(shù)
}
/**
* 加法類
*/
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 OperationMul extends Operation {
public function getValue($num1,$num2){
return $num1*$num2;
}
}
/**
* 除法類
*/
class OperationDiv extends Operation {
public function getValue($num1,$num2){
if ($num2==0){
echo "除數(shù)不能為0";
}else {
return $num1/$num2;
}
}
}
通過(guò)采用面向?qū)ο蟮睦^承特性,我們可以很容易就能對(duì)原有程序進(jìn)行擴(kuò)展,比如:‘乘方’,‘開(kāi)方’,‘對(duì)數(shù)’,‘三角函數(shù)’,‘統(tǒng)計(jì)’等,以還可以避免加載沒(méi)有必要的代碼。
如果我們現(xiàn)在需要增加一個(gè)求余的類,會(huì)非常的簡(jiǎn)單我們只需要另外寫(xiě)一個(gè)類(該類繼承虛擬基類),在類中完成相應(yīng)的功能(比如:求乘方的運(yùn)算),而且大大的降低了耦合度,方便日后的維護(hù)及擴(kuò)展。
現(xiàn)在還有一個(gè)問(wèn)題未解決,就是如何讓程序根據(jù)用戶輸入的操作符實(shí)例化相應(yīng)的對(duì)象呢?
解決辦法:使用一個(gè)單獨(dú)的類來(lái)實(shí)現(xiàn)實(shí)例化的過(guò)程,這個(gè)類就是工廠
/**
* 工長(zhǎng)類,主要用來(lái)創(chuàng)建對(duì)象
* 功能:根據(jù)輸入的運(yùn)算符號(hào),工廠就能實(shí)例化出合適的對(duì)象
*
*/
class Factory{
public static function createObj($operate){
switch ($operate){
case '+':
return new OperationAdd();
break;
case '-':
return new OperationSub();
break;
case '*':
return new OperationSub();
break;
case '/':
return new OperationDiv();
break;
}
}
}
$test=Factory::createObj('/');
$result=$test->getValue(23,0);
echo $result;
觀察者模式
命令鏈模式
策略模式
這些相關(guān)設(shè)計(jì)模式下去自行了解,主要把單例模式和工廠模式弄懂;