那些PHP中常用的设计模式

作者: 乘风御上者 分类: PHP 发布时间: 2020-04-22 00:23

做过几年php开发的道友,多多少少都会使用或接触几种设计模式,可能只是懂得代码的设计逻辑却不一定知道相应的术语。

/**
 * 单例模式: 常用在数据库连接中
 * 完整的单例,从各个角度防止创建出第二个实例
 */
class DataBase
{
	// 唯一的实例化变量
	private static $instance;

	// 构造函数声明为 private 后使用new实例化该类会报错
	private function __construct()        
	{
	}

	// 获取该类的唯一方式
	public static function getInstance()
	{
	    // 检测是否已经实例化
		if(!isset(self::$instance)){
			self::$instance = new self();
		}
		return self::$instance;
	}

	// 阻止用户复制对象实例
	private function __clone()
	{
	}

	// 防止反序列化
	private function __wakeup()
	{
	}
}

// 使用
DataBase::getInstance()
/**
 * 适配器模式:PDO的实现方式既是如此
 * 在php中就是 interface (语法:接口)的常用形态
 * 实现不同底层封装成统一调用方式
 */
// 定义一个接口,既是定义一种规则,所有继承该接口的类都要遵守该规则
interface IDatabase
{
    function connect($host, $user, $passwd, $dbname);
    function query($sql);
    function close();
}

// 不同的类继承上面接口
class MySQLi implements IDatabase
{
    function connect($host, $user, $passwd, $dbname)
    {
        // 必须实现
    }
    function query($sql)
    {
        // 必须实现
    }

    function close()
    {
        // 必须实现
    }
}

// 同样继承接口
class Redis implements IDatabase
{
    function connect($host, $user, $passwd, $dbname)
    {
        // 必须实现
    }
    function query($sql)
    {
        // 必须实现
    }

    function close()
    {
        // 必须实现
    }
}

// 执行时选择一种
$db = new MySQLi();
// 或者
$db = new Redis();

// 使用
$db->connect('127.0.0.1', 'root', '123456', 'Test');
/**
 * 注册模式:解决全局共享和交换对象
 * 将所有需要共享的对象都注册到全局树上,实现在任何位置访问
 */
class Register
{
	// 将对象按照一定规则保存到一个数组中
	private static $objects;

	// 将对象注册到全局数上
	public static function set($alias, $object)
	{
		self::$objects[$alias] = $object;
	}

	// 获取某个注册数上的对象
	public static function get($name){
		return self::$objects[$name];
	}

	// 移除某个注册数上的对象
	public static function _unset($alias)
	{
		unset(self::$objects[$alias]);
	}
}

// 需要注册的类
class Test
{
}

// 使用
Register::set(Test::class, new Test);
$test = Register::get(Test::class);
/**
 * 工厂模式: 一处修改即可更改所有实现
 * 需要更改实例化的类时,只需要更改该工厂对应的方法即可,不需要逐一寻找代码中具体实例化的地方
 */
class Factory
{
    // 创建猫实例
    public static function createCat()
    {
        return new Cat();
    }

    // 创建狗实例
    public static function createDog()
    {
        return new Dog();
    }
}

// 猫类
class Cat
{
}
// 狗类
class Dog
{
}

// 使用
Factory::createCat();
Factory::createDog();
// 定义接口
abstract class Strategy
{
    abstract function goSchool();
}

// 不同类实现统一方法
class Run extends Strategy
{
    public function goSchool()
    {
        // ...
    }
}

// 不同类实现统一方法
class Subway extends Strategy
{
    public function goSchool()
    {
        // ...
    }
}

// 不同类实现统一方法
class Bike extends Strategy
{
    public function goSchool()
    {
        // ...
    }
}

/**
 * 策略模式: 避免使用多重条件转移语句
 * 定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换
 */
class Context
{
    // 执行时选择具体的策略
    public static function goSchool(Strategy $strategy)
    {
        return $strategy->goSchool();
    }
}

// 使用
Context::goSchool(new Bike());

想要了解更多关于PHP的设计模式,可以查阅 PHP 设计模式全集

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

发表回复