美文网首页
单例模式和工厂模式

单例模式和工厂模式

作者: 舒小贱 | 来源:发表于2017-11-01 19:22 被阅读0次

    单例模式

    class Single {
        private $name;//声明一个私有的实例变量
        private function __construct(){//声明私有构造方法为了防止外部代码使用new来创建对象。
        
        }
    
        static public $instance;//声明一个静态变量(保存在类中唯一的一个实例)
        static public function getinstance(){//声明一个getinstance()静态方法,用于检测是否有实例对象
            if(!self::$instance) self::$instance = new self();
            return self::$instance;
        }
    
        public function setname($n){ $this->name = $n; }
        public function getname(){ return $this->name; }
    }
    
    
    $oa = Single::getinstance();
    $ob = Single::getinstance();
    $oa->setname('hello world');
    $ob->setname('good morning');
    echo $oa->getname();//good morning
    echo $ob->getname();//good morning
    

    数据库连接可以使用单例模式。。。单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。针对楼主所说,单例确保数据库驱动的连接类只被初始化一次(不是数据库的连接数),这样之后的请求都使用同一个连接实例,这样做对于并发量不是很大的时候肯定是没问题的。对于并发量很大的时候,容易造成一个线程使用这个连接,然后一直不释放,后面的线程也不能用,这肯定是有问题的了,通常我们会做一个连接池,比如创建20个连接池等等。视具体情况而定。

    工厂模式

    class Factory {//创建一个基本的工厂类
        static public function fac($id){//创建一个返回对象实例的静态方法
            if(1 == $id) return new A();
            elseif(2==$id) return new B();
            elseif(3==$id) return new C();
            return new D();
        }
    }
    
    interface FetchName {//创建一个接口
        public function getname();//
    }
    
    class A implements FetchName{
        private $name = "AAAAA";
        public function getname(){ return $this->name; }
    }
    
    class C implements FetchName{
        private $name = "CCCCC";
        public function getname(){ return $this->name; }
    }
    class B implements FetchName{
        private $name = "BBBBB";
        public function getname(){ return $this->name; }
    }
    
    class D implements FetchName{
        private $name = "DDDDD";
        public function getname(){ return $this->name; }
    }
    
    
    $o = Factory::fac(6);//调用工厂类中的方法
    if($o instanceof FetchName){
      echo  $o->getname();//DDDDD
    }
    
    $p=Factory::fac(3);
    echo $p->getname();//CCCCC
    

    相关文章

      网友评论

          本文标题:单例模式和工厂模式

          本文链接:https://www.haomeiwen.com/subject/nrngpxtx.html