PHP 单列模式和工厂模式

单列模式

单列模式主要作用是防止一个类被重复实例化而占用系统资源,单列类必须要有以下三种元素

  • 必须有一个标记为private的构造函数
  • 必须有一个保存该类实例的静态成员变量
  • 必须有一个访问该实例的公共静态方法,通常使用getInstance()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Some{
private $db;
public static $_instance;

private function __construct(){
$this->db = pdo::content('xx');
}

//防止对象被复制或克隆
private _clone(){};

public static getInstance(){
if(! (self::$_instance instanceof self)){
self::$_instance = new self();
}
return self::$instance;
}
public function query(){
retun 'sql';
}
}

//使用
$db = Some::getInstance();
$db->query();

工厂模式

工厂模式的作用在于可以根据输入参数或者应用程序配置的不同,创建一种实例化的类,该类会根据参数返回不同功能类的实例化,工厂模式通常包含一个名为factory()的方法,这个方法必须访问一个实例化的对象。

工厂模式与接口配合使用,能够规定固定的API,让不同作用的类实现相同的功能,例如数据库的处理,不同类型数据库的数据处理就可以使用工厂模式。
接口定义对数据处理的规则,工厂类负责根据传入的参数,判断实例化哪一个数据库类。

先使用,在过程中更据条件,实例化选择返回不同的类。这就是工厂模式(个人理解)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
//编写接口制定规则
interface IDatabasecontent {
//数据库查询
public function query();

//insert
public function insert($val, $table);
}

//mongodb 
class Mongodb implementes IDatabasescontent {
public function query(){
//mongodb查询
}
public function insert($val, $table){
//mongodb插入
}
}

//mysql
class Mysql implementes IDatabasecontent {
public function query(){
//mysql查询
}
public function insert($val, $table){
//mysql插入
}
}

//工厂类
class DatabaseFactory {
public static function factory(){
$type = loadTypeFromConfig();
switch($type){
case 'mongodb' :
return new Mongodb();
break;
case 'mysql':
return new Mysql();
break;
default:
//其他
}
}
}

$instance = DatabaseFactory::factory('数据库链接');
$instance->query();