、php
<?php //要解決的問題 在一個方法中屢次調用類 //屢次調用父類相同的類 class Pdoo { public function __construct(){} //這是個數據庫的類 function select($name) { echo "正宗" . $name; } } class Conn { static $db; private function __construct() { } private function __clone() { } //返回的的是數據庫的鏈接 而非Base類 public static function getInstance() { if (self::$db == null) { self::$db = new Pdoo (); } return self::$db; } //這個方法是無效的 function select($name) { echo $name; } } class Db { static $db; static $instanceInternalCache; private function __construct() { //初始話 跟鏈接數據庫沒有任何關係的 } private function __clone() { } //不能在這裏實例化 不然數據庫鏈接就無效了 public static function getDb() { } //這裏解決 在同一個方法中屢次調用A不會被屢次實例化 //解決不了多個派生類被實例化 也就是有多少派生類 數據庫就要鏈接多少次 public static function getInstance($model) { if (self::$instanceInternalCache [$model] == NULL) { self::$instanceInternalCache [$model] = new $model (); } return self::$instanceInternalCache [$model]; } function select($name) { Conn::getInstance ()->select ( $name ); } } class A extends Db { function s($name) { $this->select($name); } public static function instance() { return parent::getInstance ( __CLASS__ ); } } class B extends Db { function s($name) { $this->select($name); } public static function instance() { return parent::getInstance ( __CLASS__ ); } } class Main { public function t() { A::instance ()->select ( "1" ); A::instance ()->select ( "11" ); B::instance ()->select ( "2" ); } } $t = new Main (); $t->t ();