单例模式
特点:
三私一公:私有的静态变量(存放实例),私有的构造方法(防止创建实例),私有的克隆方法(防止克隆对象),公有的静态方法(对外界提供实例)
应用场景:
程序应用中,涉及到数据库操作时,如果每次操作的时候连接数据库,会带来大量的资源消耗。可以通过单例模式,创建唯一的数据库连接对象。
<?php
class Singleton
{
private static $_instance;
private function __construct(){}
private function __clone(){}
public static function getInstance()
{
if(self::$_instance instanceof Singleton){//instanceof 判断一个实例是否是某个类的对象
self::$_instance = new Singleton();
}
return self::$_instance;
}
}
注册树模式
特点:
注册树模式通过将对象实例注册到一棵全局的对象树上,需要的时候从对象树上采摘的模式设计方法。
应用:
不管你是通过单例模式还是工厂模式还是二者结合生成的对象,都统统给我“插到”注册树上。我用某个对象的时候,直接从注册树上取一下就好。这和我们使用全局变量一样的方便实用。而且注册树模式还为其他模式提供了一种非常好的想法。 (如下实例是单例,工厂,注册树的联合使用)
比如我们有一个Rand类,我们在框架初始化的时候注册到注册树上,这样,只要我们想用的时候,直接从注册树上摘取这个对象,就可以很方便的去调用其中的方法。而且用工厂方式管理创建对象,省去了频繁的new对象,单例模式管理对象的创建也避免了对象的重复创建。
<?php
//创建单例
class Single{
protected static $ins=null;
public static function getInstance( $objName ){
$class = ucfirst( $objName );
if (self::$ins instanceof $class ) {
return self::$ins;
}
self::$ins = new $class();
return self::$ins;
}
}
//工厂模式
class RandFactory{
public static function factory( $objName ){
return Single::getInstance( $objName );
}
}
//注册树
class Register{
protected static $objects;
public static function set( $alias,$object ){
self::$objects[$alias] = $object;
}
public static function get( $alias ){
return self::$objects[$alias];
}
public static function _unset( $alias ){
unset( self::$objects[$alias] );
}
}
//需要注册的类
class Rand
{
public function say()
{
echo "I am Rand";
}
}
Register::set('rand', RandFactory::factory('rand'));
$object = Register::get('rand');
$object->say();
工厂模式
特点:
将调用对象与创建对象分离,调用者直接向工厂请求,减少代码的耦合.提高系统的可维护性与可扩展性。
提供一种类,具有为您创建对象的某些方法,这样就可以使用工厂类创建对象,而不直接使用new。这样如果想更改创建的对象类型,只需更改该工厂即可。
class A{
public $class; // public $class = $_GET['c']; //类名
public $method; // public $method = $_GET['m']; //方法
public function __construct($class,$method){
$this->class = ucfirst(strtolower($class)); //对类名进行安全处理
$this->method = strtolower($method); //对方法名进行安全处理
$this->work($this->class,$this->method);
}
public function work($class,$method){
// 把文件命名成 (类名.class.php的形式),就可以通过类名找到文件。
//include '文件名(文件在别的地方)'; #例如 include './index.php'; 引入文件然后实例化类。
$c = new $class; //实例化类
$c->$method(); //访问类的方法
}
}
class B{
public function ba(){
echo '实例化后的ba方法<br>';
}
public function bb(){
echo '实例化后的bb方法<br>';
}
}
class C{
public function ca(){
echo '实例化后的ca方法<br>';
}
public function cb(){
echo '实例化后的cb方法<br>';
}
}
//工厂模式的实现
$a = new A('b','ba'); // 通过类访问方法
$a = new A('C','ca'); // 通过类访问方法