MENU

PHP 设计模式整理

April 14, 2021 • Read: 1229 • PHP

单例模式

GoF定义: 保证一个类仅有一个实例,并提供一个访问它的全局访问点。

实现思路:

  • 用静态变量保存实例化后的自己
  • 把构造函数和克隆函数私有化,防止外部实例化或克隆
  • 使用静态方法获得唯一的一个对象

    • 判断静态变量是否有保存实例化后的对象,如果没有就实例化自己,然后保存到静态变量里
    • 最后返回静态变量

单例模式用途:

单例模式的最大用途就是让对象全局唯一,有些类的创建开销很大,而且我们并不需要每次使用都需要使用新的对象,完全可以对一个对象进行复用,比如数据库操作类、网络请求类、日志操作类、配置管理服务等。

单例在PHP中,如果是一个进程下,就是唯一的。如果通过nginx同时拉起多个fpm,这时不是唯一的,而是一个进程中一个。

代码部分:

<?php
class Singleton{
    // 存储变量
    private static $obj=null;
    // 私有化构造函数
    private function __construct(){}
    // 私有化克隆函数
    private function __clone(){}

    //  公有化 实例方法
    public static function get(){
        // 判断是否有被实例化
        if(!(self::$obj instanceof Singleton)){
            self::$obj = new Singleton;
        }
        return self::$obj;
    }
    public function name(){
        return 'zhangsan';
    }

}

$a=Singleton::get();
$b=Singleton::get();
// 输出 true
var_dump($a===$b);

简单工厂模式

最简单的设计模式,也叫静态工厂模式,通过专门定义一个类来负责创建其他类的实例,用户不需要知道创建类的逻辑只需要传递不同的内容就可以获得不同的对象产品。如果需要新增或修改产品的话只需要修改工厂方法就行了,客户端不需要修改。

<?php
 class dbmysql{
     public function conn(){
         echo '连接上了mysql';
     }
 }
class dbsqlite{
    public function conn(){
        echo '连接上了sqlite';
    }
}

// 简单工厂,工厂方法
class Factory{
    public static function createDb($type = ''){
        $obj=null;
        switch ($type) {
            case 'mysql':
                $obj = new dbmysql();
                break;
            case 'sqlite':
                $obj = new dbsqlite();
                break;
            default:
                throw new Exception("Error db type", 1);
                break;
        }
        return $obj;
    } 
}
// 方法只允许传递数据库名称,由工厂模式根据不同的传参去实例化不同的类
// 用户只知道服务端开放了一个Factory::createDb方法
$db=Factory::createDb('mysql');
$db->conn();

$db=Factory::createDb('sqldite');
$db->conn();

工厂方法模式

GoF定义: 定义一个用于创建对象的接口,让子类决定实例化哪一个类。

让每个具体的实现类来进行商品对象的创建。没错,单一和封闭,每个单独的创建者子类只在工厂方法中和一个商品有耦合,有没有其他商品和其他的工厂来跟客户合作过这个子类完全不知道。

<?php
 class dbmysql{
     public function conn(){
         echo '连接上了mysql';
     }
 }
class dbsqlite{
    public function conn(){
        echo '连接上了sqlite';
    }
}
class mariadb{
    public function conn(){
        echo '连接上了mariadb';
    }
}

// 工厂方法模式 抽象工厂模式
interface Factory{
    public static function createDb();
}

class MysqlFactory implements Factory {
    public static function createDb()
    {
        return new dbmysql();
    }
}

class SqliteFactory implements Factory {
    public static function createDb()
    {
        return new dbsqlite();
    }
}

class MariadbFactory implements Factory {
    public static function createDb()
    {
        return new mariadb();
    }
}

$fact=new MysqlFactory();
$db=$fact->createDb();
$db->conn();