ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] [PHP 设计模式全集](https://learnku.com/docs/php-design-patterns/2018) ## 单例模式 `instance` * 有多种实现模式,如饿汉、懒汉、登记、注册、双重锁等 > * 三私一公: > * * 私有(`private`)的静态属性,存放实例化的类 > * * 私有(`private`)的构造方法(`__constroller`),禁止外部实例化 > * * 私有(`private`)的克隆方法(`__clone`),禁止外部克隆类 > * * 公共(`public`)的静态方法,返回唯一实例的一个引用。 > * 饿汉模式: > * * 在类加载的时候就实例化,并且创建单例对象。 > * * 在线程还没出现之前就已经实例化了,因此饿汉式线程一定是安全的 > * * 占用内存空间,用空间换时间,执行效率高 > * 懒汉模式: > * * 默认不会实例化,外部什么时候调用什么时候`new` > * * 懒汉式加载是在使用时才会去`new` 实例的,那么`new`的时候是一个动态的过程,并发情况下可能会出现多个,那就是加`同步锁`,避免这种情况发生。 > * * 懒汉式什么时候需要什么时候实例化,相对来说不浪费内存。 ``` class Config { private static $instance = null; private function __construct(){} private function __clone(){} public static function getInstance() { //检测当前类属性$instance是否已经保存了当前类的实例 if (self::$instance == null) { //如果没有,则创建当前类的实例 self::$instance = new self(); } //如果已经有了当前类实例,就直接返回,不要重复创建类实例 return self::$instance; } } ``` ## 工厂模式 `Factory` * 一个类通过本身的静态方法来,实例化一个类并返回一个实例对象; ## 策略模式 ## 观察模式 ## 注册模式 * 框架容器使用的是 注册模式 * 解决全局共享和交换对象。已经创建好的对象,挂在到某个全局可以使用的数组上,在需要使用的时候,直接从该数组上获取即可。将对象注册到全局的树上。任何地方直接去访问。 ``` <?php class Register { protected static $objects; public function set($alias,$object)//将对象注册到全局的树上     { self::$objects[$alias]=$object;//将对象放到树上     } public static function get($name)     { returnself::$objects[$name];//获取某个注册到树上的对象     } public function __unset($alias)     { unset(self::$objects[$alias]);//移除某个注册到树上的对象。     } } ``` ## 适配器模式 * 定义接口,继承接口类必须实现接口方法 * 例:PHP中的数据库操作有MySQL,MySQLi,PDO三种,可以用适配器模式统一成一致,使不同的数据库操作,统一成一样的API ``` <?php interfaceIDatabase { function connect($host, $user, $passwd, $dbname); function query($sql); function close(); } ``` ## 原型模式 ## 装饰器模式