PHP设计模式学习下
2019-08-09 05:49:14来源:编程学习网 阅读 ()
单例模式理解:
-
使某个类的对象只被创建一次。
-
单例模式的最大好处就是减少资源的浪费,保证整个环境中只存在一个实例化的对象,特别适合资源连接类的编写。
-
单例模式的意思就是只创建一个资源(对象,数据库链接等),说白了,本质就是防止外部实例化类+判断是否存在来返回或创建后返回对象。
// 单例模式(口诀:三私一公) class Singleton{ //私有化构造方法,禁止外部实例化对象 private function __construct(){} //私有化__clone,防止对象被克隆 private function __clone(){} //私有化内部实例化的对象 private static $instance = null; // 公有静态实例方法 public static function getInstance(){ if(self::$instance == null){ //内部实例化对象 self::$instance = new self(); } return self::$instance; } }
工厂模式理解:
-
工厂方法或者类生成对象,而不是在代码中直接new。
-
我们定义一个专门用来创建其它对象的类。 这样在需要调用某个类的时候,我们就不需要去使用new关键字实例化这个类,而是通过我们的工厂类调用某个方法得到类的实例。
好处:当我们对象所对应的类的类名发生变化的时候,我们只需要改一下工厂类类里面的实例化方法即可。不需要外部改所有的地方。
class Factory{ static function createDatabase(){ $db =new Database(); return $db; } } $db=Factory::createDatabase();
注册器模式理解:
-
全局共享和交换对象
-
单纯使用工厂模式还是要不断的创建对象,结合注册树模式,就简化了创建对象的麻烦。
代码笔记1:
Register.php,用来将一些对象注册到全局的注册树上,可以在任何地方访问。set():将对象隐射到全局树上,_unset():从树上移除。get():去注册到树上的对象。在框架初始化的时候,会做注册器的初始化操作,然后可以在任何地方去访问注册器的方法。
namespace IMooc; class Register{ protected static $objects; static function set($alias,$object){ self::$objects[$alias] = $object; } static function get($name){ return self::$objects[$name]; } function _unset($alias){ unset(self::$objects[$alias]); } } 在工厂模式写下 class Factory{ static function createDatabase(){ $db =Database::getInstance(); Register::set('db1', $db); return $db; } } 在index.php $db = IMooc\Factory::createDatabase(); $db1 = \IMooc\Register::get('db1'); var_dump($db); var_dump($db1);
代码笔记2
class Register { protected static $objects =null; //注册 public static function bind($alias, $obj) { self::$objects[$alias]=$obj; } //解绑 public static function unbind($alias) { unset(self::$objects[$alias]); } //获得 public static function get($alias) { return self::$objects[$alias]; } } class A { } Register::bind('a',new A()); var_dump(Register::get('a'));
适配器模式理解:
-
使用适配器策略是为了更好的兼容。类似于手机电源适配器,如果能用一个充电器对所有手机充电当然是最方便的。无论什么手机,都只需要拿一个充电器。否则,不同手机不同充电器,太麻烦。
-
新建一个接口 IDatabase 然后在这个接口里面申明统一的方法体,再让不同的类去实现这个接口,和重写其抽象方法。当我们在入口文件使用到不同的类的时候,就只是实例化的类名不同,其它调用方法体的地方都一致
应用场景
如程序数据库有关联mysql、mysqli、pdo、sqlite、postgresql等操作,而你需要根据情况换数据库操作时,可以使用适配器模式统一接口,这样代码中除了数据库配置之外,就不需要做而外的更改。
同理cache(缓存)的场景也是,无论使用memcache还是redis等,在更换的时候都会很方便,节约时间。
<?php header('Content-Type:text/html;charset=utf-8'); /** * 适配器模式演示代码 * Target适配目标: IDataBase接口 * Adaptee被适配者: mysql和mysql_i、postgresql的数据库操作函数 * Adapter适配器 :mysql类和mysql_i、postgresql类 */ /** * Interface IDatabase 适配目标,规定的接口将被适配对象实现 * 约定好统一的api行为 */ interface IDatabase { // 定义数据库连接方法 public function connect($host, $username, $password, $database); // 定义数据库查询方法 public function query($sql); // 关闭数据库 public function close(); } /** * Class Mysql 适配器 */ class Mysql implements IDatabase { protected $connect; // 连接资源 /** * 实现连接方法 * * @param $host host * @param $username 用户名 * @param $password 密码 * @param $database 数据库名 */ public function connect($host, $username, $password, $database) { $connect = mysql_connect($host, $username, $password); mysql_select_db($database, $connect); $this->connect = $connect; //其他操作 } /** * 实现查询方法 * * @param $sql 需要被查询的sql语句 * @return mi */ public function query($sql) { return mysql_query($sql); } // 实现关闭方法 public function close() { mysql_close(); } } /** * Class Mysql 适配器 */ class Mysql_i implements IDatabase { protected $connect; // 连接资源 /** * 实现连接方法 * * @param $host host * @param $username 用户名 * @param $password 密码 * @param $database 数据库名 */ public function connect($host, $username, $password, $database) { $connect = mysqli_connect($host, $username, $password, $database); $this->connect = $connect; //其他操作 } /** * 实现查询方法 * * @param $sql 需要被查询的sql语句 */ public function query($sql) { return mysqli_query($this->connect, $sql); } // 实现关闭 public function close() { mysqli_close($this->connect); } } /** * Class Postgresql 适配器 */ class Postgresql implements IDatabase { protected $connect; // 连接资源 /** * 实现连接方法 * * @param $host * @param $username * @param $password * @param $database */ public function connect($host, $username, $password, $database) { $this->connect = pg_connect("host=$host dbname=$database user=$username password=$password"); //其他操作 } /** * 实现查询方法 * * @param $sql 需要被查询的sql语句 */ public function query($sql) { // 其他操作 } // 实现关闭方法 public function close() { } } /** * 客户端使用演示 * 这里以mysql为例 * 只要模式设计好,不论有多少种数据库,实现和调用方式都是一样的 * 因为都是实现的同一个接口,所以都是可以随意切换的 */ $host = 'localhost'; $username = 'root'; $password = 'root'; $database = 'mysql'; //$client = new Postgresql(); //$client = new Mysql(); $client = new Mysql_i(); $client->connect($host, $username, $password, $database); $result = $client->query("select * from db"); while ($rows = mysqli_fetch_array($result)) { var_dump($rows); } $client->close();
原文链接:http://www.phpxs.com/post/6442/
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- PHP访问MySQL查询超时怎么办 2020-03-09
- PHP简单实现单点登录功能示例 2019-10-09
- 关于php开启错误提示的总结 2019-10-09
- PHP进阶学习之垃圾回收机制详解 2019-10-09
- thinkphp5框架前后端分离项目实现分页功能的方法分析 2019-10-08
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash