单例模式的应用问题

monkeyhjl 2012-03-10 04:12:43
一、对于db类需要连多个数据库是不是不适合或者没法用单例模式?
二、有一个类文件:a.class.php,里面有个A类,一般使用单例的话都是在这个A类里加上getInstance静态方法,同时__construct构造函数设为私有的。但是线上程序都是直接new的A类,这样改了会影响线上跑的程序。于是我想再创建一个c.a.class.php,代码如下:

<?php
include("a.class.php");
class CreA{
static private $_instance = NULL;
private function __construct(){}
static public function getInstance() {
if (is_null(self::$_instance) || !isset(self::$_instance)) {
self::$_instance = new A();
}
return self::$_instance;
}
}
?>

对于新的程序要用到a对象的采用CreA::getInstance()单例的方式,请问这种方式是否可行?
三、假如a.class.php这个文件比较大,我在user.class.php里的User类有某几个方法要用到a对象,采用上面的单例模式来调用,那我的c.a.class.php改成如下:

<?php
class CreA{
static private $_instance = NULL;
private function __construct(){}
static public function getInstance() {
if (is_null(self::$_instance) || !isset(self::$_instance)) {
include("a.class.php");
self::$_instance = new A();
}
return self::$_instance;
}
}
?>

这样是不是更好,还是和上面那样写没有区别?
...全文
115 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
码无边 2012-03-16
  • 打赏
  • 举报
回复
public static function getInstance($db_host,$db_name,$db_user,$db_pwd){
if((self::$_instance instanceof self)&&self::$_instance->_host===$db_host&&self::$_instance->_dbname===$db_name&&self::$_instance->_dbuser===$db_user){
;
}else{
self::$_instance=new self($db_host,$db_name,$db_user,$db_pwd);
}
return self::$_instance;
}
码无边 2012-03-16
  • 打赏
  • 举报
回复
<?php

/**
* 数据库连接工厂类
*
* @author Administrator
* @package defaultPackage
*/
class DbFactory{
const CURDATABASE='DataBase';//默认连接Mysql(新增、修改、删除)
const SELDB='DataBase_Rep';//查询数据库
const MSSQL='MSSQL';
public static function &getDbLink($curDataBase='DataBase_Rep'){
$db_config=nul;
$conn=null;
switch ($curDataBase){
case DbFactory::CURDATABASE:
$db_config=new Config_ini_file(INI_FILE,DbFactory::CURDATABASE);
$conn=MySqlDB::getInstance($db_config->DataBase->Db_Host,$db_config->DataBase->Db_Name,$db_config->DataBase->Db_User,$db_config->DataBase->Db_Pwd);
break;
case self::SELDB:
$db_config=new Config_ini_file(INI_FILE,DbFactory::SELDB);
$conn=MySqlDB::getInstance($db_config->DataBase_Rep->Db_Host,$db_config->DataBase_Rep->Db_Name,$db_config->DataBase_Rep->Db_User,$db_config->DataBase_Rep->Db_Pwd);
break;
case self::MSSQL:
$db_config=new Config_ini_file(INI_FILE,DbFactory::MSSQL);
$conn=MsSqlDB::getInstance($db_config->MSSQL->Db_Host,$db_config->MSSQL->Db_Name,$db_config->MSSQL->Db_User,$db_config->MSSQL->Db_Pwd);
break;
default:
$db_config=new Config_ini_file(INI_FILE,DbFactory::SELDB);
$conn=MySqlDB::getInstance($db_config->DataBase_Rep->Db_Host,$db_config->DataBase_Rep->Db_Name,$db_config->DataBase_Rep->Db_User,$db_config->DataBase_Rep->Db_Pwd);
break;
}
return $conn;
}
}
?>
helloyou0 2012-03-15
  • 打赏
  • 举报
回复
一,可以用多个单例,或者改造的单例,或者registry
二和三,如果用autoloading的话,可以省掉那句include
"线上程序都是直接new的A类",如果改动不算太大的话,当然还是改掉好,否则新旧两种方式混用,有可能有麻烦
monkeyhjl 2012-03-15
  • 打赏
  • 举报
回复
什么叫php上层函数的底层实现方式?
狄默默斯基 2012-03-10
  • 打赏
  • 举报
回复
扯淡模式,我一向认为这是php上层函数的底层实现方式。
xuzuning 2012-03-10
  • 打赏
  • 举报
回复
那么,是否先探讨一下“单例模式”的优缺点呢?
或是说“单例模式”给我们带来了什么?

不是更好一点吗

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧