最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PHP面向?qū)ο髮W(xué)習(xí)筆記之二 生成對(duì)象的設(shè)計(jì)模式

 更新時(shí)間:2012年10月06日 22:42:41   作者:  
PHP面向?qū)ο髮W(xué)習(xí)筆記之二 生成對(duì)象的設(shè)計(jì)模式

一. 單例模式(Singleton)
如果應(yīng)用程序每次包含且僅包含一個(gè)對(duì)象,那么這個(gè)對(duì)象就是一單例. 用來(lái)替代全局變量.

復(fù)制代碼 代碼如下:

<?php
require_once("DB.php");
class DatabaseConnection{
<STRONG><SPAN style="COLOR: #ff0000">public static function get()</SPAN></STRONG>{
static $db = null;
if ( $db == null )
$db = new DatabaseConnection();
return $db;
}
private $_handle = null;
<STRONG><SPAN style="COLOR: #ff0000">private function __construct()</SPAN></STRONG> {
$dsn = 'mysql://root:password@localhost/photos';
$this->_handle =& DB::Connect( $dsn, array() );
}
public function handle()
{
return $this->_handle;
}
}
print( "Handle = ".DatabaseConnection::get()->handle()."\n" );
print( "Handle = ".DatabaseConnection::get()->handle()."\n" );
?>


二.工廠方法模式(factory method)要解決的問(wèn)題:

1>在代碼運(yùn)行時(shí)候才知道要生成的對(duì)象類型; 2>對(duì)象類型可能要擴(kuò)充新產(chǎn)品類型; 3>每個(gè)產(chǎn)品類型都可以定制特定的功能;工廠方法模式把創(chuàng)建者類與要生產(chǎn)的產(chǎn)品類分離.創(chuàng)建者是一個(gè)工廠類,其中定義了用于生成產(chǎn)品對(duì)象的類方法.如果沒(méi)有提供默認(rèn)實(shí)現(xiàn),就由創(chuàng)建者類的子類來(lái)執(zhí)行實(shí)例化.一般情況下,就是每個(gè)創(chuàng)建者類的子類實(shí)例化一個(gè)相應(yīng)的產(chǎn)品子類.工廠模式的優(yōu)點(diǎn)就在創(chuàng)建對(duì)象上。 它的任務(wù)就是把對(duì)象的創(chuàng)建過(guò)程都封裝起來(lái),然后返回一個(gè)所需要的新類。想改變對(duì)象的結(jié)構(gòu)和建立對(duì)象的方式,只需選擇對(duì)象工廠,對(duì)代碼的改變只需要一次就夠了。( 工廠模式的功能是如此強(qiáng)大, 它處于是應(yīng)用的底層, 所以在許多其余的復(fù)雜模式和應(yīng)用中它會(huì)不停地出現(xiàn)。)不同處理對(duì)象,內(nèi)部自動(dòng)分流處理,但對(duì)用戶來(lái)說(shuō),只有一個(gè)方法,簡(jiǎn)單方便 使用接口方式實(shí)踐工廠模式的例子:
復(fù)制代碼 代碼如下:

interface Hello{
function say_hello();
}
class English implements Hello{
public function say_hello(){
echo "Hello!";
}
}
class Chinese implements Hello{
public function say_hello(){
echo "你好";
}
}
class speak{
public static function factory($type){
if($type == 1) $temp = new English();
else if($type == 2) $temp = new Chinese();
else{
die("Not supported!");
}
return $temp;
}
}
$test = Speak::factory(1);
$test->say_hello();

在<深入淺出設(shè)計(jì)模式>中,上面的被稱為簡(jiǎn)單工廠模式,因?yàn)檫@個(gè)工廠必須能分辨要生產(chǎn)的全部產(chǎn)品.如果有新的產(chǎn)品,必須對(duì)工廠進(jìn)行對(duì)應(yīng)修改,增加相應(yīng)的業(yè)務(wù)邏輯或判斷.簡(jiǎn)單工廠模式的一個(gè)標(biāo)志就是靜態(tài)方法實(shí)現(xiàn)工廠生產(chǎn)功能.(不簡(jiǎn)單的)工廠方法模式: 工廠方法是抽象類或接口,具體工廠實(shí)現(xiàn)這個(gè)方法(接口),讓使用者調(diào)用以創(chuàng)建具體產(chǎn)品對(duì)象(每一個(gè)產(chǎn)品都有對(duì)應(yīng)的具體工廠)下面是重寫(xiě)的hello
復(fù)制代碼 代碼如下:

//抽象工廠
interface Speaker{
function assignSpeaker();
}
//具體工廠1
class EnglishSpeaker implements Speaker{
public function assignSpeaker(){
return new English();
}
}
//具體工廠2
class ChineseSpeaker implements Speaker{
public function assignSpeaker(){
return new Chinese();
}
}
//抽象產(chǎn)品
interface Hello{
function say_hello();
}
//具體產(chǎn)品1
class English implements Hello{
public function say_hello(){
echo "Hello!";
}
}
//具體產(chǎn)品2
class Chinese implements Hello{
public function say_hello(){
echo "你好";
}
}

使用:
復(fù)制代碼 代碼如下:

if(!empty($_GET['t'])){
switch($_GET['t']){
case 1: $temp=new EnglishSpeaker();
break;
case 2: $temp=new ChineseSpeaker();
break;
}
$man=$temp->assignSpeaker();
$man->say_hello();
}

三.抽象工廠模式(Abstract Factory)產(chǎn)品族;每個(gè)實(shí)體工廠負(fù)責(zé)一個(gè)產(chǎn)品族(1,2...)的產(chǎn)品, 而每個(gè)產(chǎn)品族又劃分出幾個(gè)不同類別(A,B...)單從某一個(gè)實(shí)體工廠看,其實(shí)就是一個(gè)工廠方法模式

如果上面的hello例子,又多出來(lái)表達(dá)方式,正常和歌唱式表達(dá)(2個(gè)產(chǎn)品族)
復(fù)制代碼 代碼如下:

//抽象工廠
abstract class Speaker{
const NORMAL =1;
const SING =2;
abstract function assignSpeaker($flag_int);
}
//具體工廠1
class EnglishSpeaker extends Speaker {
public function assignSpeaker($flag_int){
switch($flag_int){
case self::NORMAL:
return new NormalEnglish();
break;
case self::SING:
return new SingEnglish();
break;
}
}
}
//具體工廠2
class ChineseSpeaker extends Speaker{
public function assignSpeaker($flag_int){
switch($flag_int){
case self::NORMAL:
return new NormalChinese();
break;
case self::SING:
return new SingChinese();
break;
}
}
}
//抽象產(chǎn)品
interface Hello{
function say_hello();
}
//具體產(chǎn)品A1
class NormalEnglish implements Hello{
public function say_hello(){
echo "Hello!";
}
}
//具體產(chǎn)品B1
class NormalChinese implements Hello{
public function say_hello(){
echo "你好!";
}
}
//具體產(chǎn)品A2
class SingEnglish implements Hello{
public function say_hello(){
echo "Oh, jingle bells, jingle bells, Hello! Hello! Hello!";
}
}
//具體產(chǎn)品B2
class SingChinese implements Hello{
public function say_hello(){
echo "叮叮當(dāng),叮叮當(dāng), 你好!你好!你好!";
}
}

使用:
復(fù)制代碼 代碼如下:

//根據(jù)程序的業(yè)務(wù)邏輯確定具體工廠
switch($_GET['language']){
case 1: $temp=new EnglishSpeaker();
break;
case 2: $temp=new ChineseSpeaker();
break;
}
//根據(jù)程序的業(yè)務(wù)邏輯確定具體產(chǎn)品,無(wú)需關(guān)心是哪個(gè)具體工廠了,維護(hù)性提高
$man=$temp->assignSpeaker( $_GET['style']);
//使用產(chǎn)品,無(wú)需關(guān)心是哪個(gè)具體產(chǎn)品
$man->say_hello();

四.原型模式(Prototype)
使用clone 來(lái)復(fù)制已存在的具體產(chǎn)品,然后具體產(chǎn)品類本身就成為他們自己生成的基礎(chǔ).

相關(guān)文章

  • PHP連接MSSQL方法匯總

    PHP連接MSSQL方法匯總

    這篇文章主要為大家詳細(xì)匯總了PHP連接MSSQL的實(shí)現(xiàn)方法,幫助大家更好的實(shí)現(xiàn)PHP與MSSQL的連接,感興趣的小伙伴們可以參考一下
    2016-02-02
  • apache中為php 設(shè)置虛擬目錄

    apache中為php 設(shè)置虛擬目錄

    這篇文章主要介紹了apache中為php 設(shè)置虛擬目錄,需要的朋友可以參考下
    2014-12-12
  • PHP多進(jìn)程簡(jiǎn)單實(shí)例小結(jié)

    PHP多進(jìn)程簡(jiǎn)單實(shí)例小結(jié)

    這篇文章主要介紹了PHP多進(jìn)程,結(jié)合簡(jiǎn)單實(shí)例形式總結(jié)分析了PHP多進(jìn)程相關(guān)原理、實(shí)現(xiàn)方法及操作注意事項(xiàng),需要的朋友可以參考下
    2019-11-11
  • PHP+Oracle本地開(kāi)發(fā)環(huán)境搭建方法詳解

    PHP+Oracle本地開(kāi)發(fā)環(huán)境搭建方法詳解

    在本篇文章中小編給大家分享了關(guān)于PHP+Oracle本地開(kāi)發(fā)環(huán)境搭建的步驟和技巧,需要的朋友們學(xué)習(xí)下。
    2019-04-04
  • php獲取當(dāng)前時(shí)間的毫秒數(shù)的方法

    php獲取當(dāng)前時(shí)間的毫秒數(shù)的方法

    php本身沒(méi)有提供返回毫秒數(shù)的函數(shù),但提供了一個(gè)microtime()函數(shù),借助此函數(shù),可以很容易定義一個(gè)返回毫秒數(shù)的函數(shù)
    2014-01-01
  • php修改word的實(shí)例方法

    php修改word的實(shí)例方法

    在本篇文章里小編給大家整理的是一篇關(guān)于php修改word的實(shí)例方法,有興趣的朋友們可以跟著學(xué)習(xí)參考下。
    2021-11-11
  • 使用git遷移Laravel項(xiàng)目至新開(kāi)發(fā)環(huán)境的步驟詳解

    使用git遷移Laravel項(xiàng)目至新開(kāi)發(fā)環(huán)境的步驟詳解

    這篇文章主要介紹了遷移Laravel項(xiàng)目至新開(kāi)發(fā)環(huán)境的步驟詳解,需要的朋友可以參考下
    2020-04-04
  • PHP __autoload()方法真的影響性能嗎?

    PHP __autoload()方法真的影響性能嗎?

    對(duì)于php性能問(wèn)題,議論最多的就是__autoload()方法,很多人提到這個(gè)方法非常影響性能。還有人說(shuō)opcode也能影響到__autoload()方法,所以針對(duì)這兩點(diǎn)我做了個(gè)測(cè)試
    2012-03-03
  • php實(shí)現(xiàn)獲取文件mime類型的方法

    php實(shí)現(xiàn)獲取文件mime類型的方法

    這篇文章主要介紹了php實(shí)現(xiàn)獲取文件mime類型的方法,實(shí)例分析了php實(shí)現(xiàn)獲取文件mime類型的各種常見(jiàn)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-02-02
  • PHP腳本中include文件出錯(cuò)解決方法

    PHP腳本中include文件出錯(cuò)解決方法

    經(jīng)常當(dāng)php頁(yè)面中利用include, require, require_once包含了一些其他位置的頁(yè)面時(shí),會(huì)出現(xiàn)錯(cuò)誤,比如沒(méi)有發(fā)現(xiàn)次頁(yè)面,或者權(quán)限不允許等,可以根據(jù)以下方法來(lái)排除
    2008-11-11

最新評(píng)論

青田县| 正定县| 林州市| 潢川县| 宾川县| 阿拉尔市| 澜沧| 周宁县| 德阳市| 楚雄市| 宝坻区| 黎川县| 分宜县| 开封市| 安顺市| 堆龙德庆县| 南和县| 鹤岗市| 武乡县| 库伦旗| 广宗县| 凤冈县| 麻城市| 侯马市| 沿河| 中超| 大埔区| 临桂县| 方正县| 正定县| 乳山市| 临颍县| 阿坝| 铅山县| 新竹市| 平潭县| 阿坝| 黑龙江省| 山东| 文安县| 成武县|