PHP设计模式之单例模式与工厂模式

PHP单例模式,就是一个对象只被生成一次,但该对象可以被其它众多对象使用。单例模式使用最多的场景,是数据库连接操作。我们知道,生成一个对象的操作是用new函数来实现,但是new对象都会消耗内存,而且有时候对同一个对象,在不同文件中可能会生成多次,这就造成了系统资源的浪费。然而使用单例模式,则可以很好的避免这种情况。

以数据库为例,假设我们有一个数据库的类,要实现数据库连接。如果不使用单例模式,那么在很多PHP文件中,我们可能到要创建这样的一个连接,这其实是对资源的很大浪费。那么下面介绍单例模式实现方法:

//@1单个类 单例模式
/**
*单例模式:一个类只能有一个对象(只能实例化一次)
*三私一公
私有化静态属性
私有化构造方法
私有化克隆方法
公有化静态方法 ​​​​
*/
//php下的单例模式
class Database
{
    private static $instance;
    //防止在外部进行 实例化   new Single
    private function __construct()
    {
 
    }
     //防止被克隆  $b=clone $a
    private function __clone()
    {
 
    }
  public static function getInstace()

 {  

   if(self::$db) {

      return self::$db;

   }else {

      //生成自己

      self::$db new  self();

      return self::$db;

   }  

 }
}  

//正确获取实例方法

$db = Database::getInstace();

@2工厂模式
  (1)基本的工厂类

       //要创建对象实例的类
        class MyObject{
          
        }
         //工厂类
        class MyFactory{
        public static function factory(){
        return new MyObject():
           }
        }
        $instance=MyFactory::factory();


  (2)稍微复杂点的工厂类 
    interface Transport{
        public function go();

    }

    class Bus implements Transport{
        public function go(){
            echo "bus11111";
        }
    }

    class Car implements Transport{
        public function go(){
            echo "car1111111";
        }
    }

    class Bike implements Transport{
        public function go(){
            echo "bike111111111";
        }
    }

    class transFactory{
        public static function factory($transport)
        {
            
            switch ($transport) {
                case 'bus':
                    return new Bus();
                    break;

                case 'car':
                    return new Car();
                    break;
                case 'bike':
                    return new Bike();
                    break;
            }
        }
    }

    $transport=transFactory::factory('car');
    $transport->go();
   

猜你喜欢

转载自blog.csdn.net/stand_forever/article/details/87004371