php设计模式

本文介绍了单例模式和工厂模式在程序设计中的应用。单例模式确保一个类只有一个实例,常用于数据库连接管理,减少资源消耗。工厂模式则将对象创建与调用分离,提高系统的可维护性和扩展性。文中通过PHP代码展示了如何结合单例、工厂模式和注册树模式来管理类的实例,以实现更高效的对象使用和管理。
摘要由CSDN通过智能技术生成

单例模式

特点:
三私一公:私有的静态变量(存放实例),私有的构造方法(防止创建实例),私有的克隆方法(防止克隆对象),公有的静态方法(对外界提供实例)

应用场景:
程序应用中,涉及到数据库操作时,如果每次操作的时候连接数据库,会带来大量的资源消耗。可以通过单例模式,创建唯一的数据库连接对象。
 

<?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');  // 通过类访问方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值