1)工厂模式:
工厂方法或者类生成对象,而不是代码中直接new
多用来生成对象
好处。如果很多个文件都使用了这个类的话,如果修改需要去每个文件下都进行修改,而使用工厂模式的话,则只用在类里面修改创建方法就好了。
很多其他高级的模式都是依赖于工厂模式的。
实现方式,就是在类里面之间实现new的方式,然后返回生成的对象就行了,这样在其他文件使用的时候,只要调用这个生成方法就好了。
Factory类
<?php
namespace Imooc;
class Factory{
static function createDatabase(){
$db = new Database;
return $db;
}
}
?>
调用的时候:
$db = Imooc\Factory::createDatabase();
//这样就能代替new的方法了
2)单例模式
使某个类或者对象仅允许创建一个
比如数据库这种的话,虽然很多地方都进行调用,这样就会连接多次数据库,会造成数据库浪费,所以数据库这样的话,使用单例模式,这样只会创建一个数据库连接。
实现方式:
通过将类的构造函数__construct方法继承然后定义为私有的方式可以让其他地方无法用new的方式实例化。
然后写一个类似getInstance的方法。这个方法就是判断是否有已有实例化的对象。如果有的话,则返回这个对象,如果没有,即第一次调用的时候,则自己用new方式实例化。
<?php
//设置一个属性方便设计模式
protected $db;
private function __construct() {
//对构造函数进行私有话处理的,在其他文件或者类里面,如果你使用new来实例化这个类的话,会提示无法实例化
}
static function getInstance() {
//然后通过new self这种形式来调用私有__construct的构造方法,一般new的时候调用的就是__construct的方法
//赋值到静态属性上
if(self::$db) {
//如果存在的话,直接返回已有的属性就好了 //这就是单例模式的实现方式
return self::$db;
} else {
self::$db = new self();
return self::$db;
}
}
?>
3)注册树模式
实现全局共享,这样比如单独写一个方法的时候,不用每次都传递参数了,直接用set把他放到注册类中,然后用想调用的时候用get方法获取。
上述两个模式有个缺点的话,是必须去调用这个工厂或者单例。
建立一个register的类,然后创建一个set,get,_unset方法。
然后创建一个全局的$object类的对象,然后再set中,把东西保存到数组里。这样全局都可以使用了。
<?php
namespace Imooc;
class Register {
protected static $objects;
//加上static就不会显示黄色错误了
static function set($alias, $object) {
//当调用这个set方法的时候,映射到$objects这个对象上
self::$objects[$alias] = $object;
}
static function get($name) {
return self::$objects[$name];
}
function _unset($alias) {
//因为unset是php自带的函数,所以要加个下划线
unset(self::$objects[$alias]);
}
}
?>
使用的时候
在工厂类中,添加一个set的方法进行保存
<?php
namespace Imooc;
class Factory {
static function createDatabase() {
//
$db = Database::getInstance();
//
return $db;
//注册数模式
$db = Database::getInstance();
//如果把对象映射到身份证上面。这样在其他文件调用的时候只用调用一次
Register::set('db1', $db);
return $db;
}
}
?>
然后在index.php中调用的时候时候,调用get方法就能获取对象了。
$db = \Imooc\Register::get('db1');