工厂模式

工厂模式是我们最常用的实例化对象模式,是用工厂方法代替new操作的一种模式。

使用工厂模式的好处是如果你想要更改所实例化的类名等,则只需要更改该工厂方法内容即可,不需逐一寻找代码中具体实例化的地方。

目的:为系统结构提供动态拓展机制,减少了耦合。

<?php

header('Content-Type:text/html;charset=utf-8');
/**
* 简单工厂模式(静态工厂模式)
*/
/**
* interface people
*/
interface people
{
public function say();
}
/**
* Class man 继承people的男人类
*/
class man implements people
{
public function say()
{
echo "男人<br>";
}
}
/**
* Class woman 继承people的女人类
*/
class woman implements people
{
public function say()
{
echo "女人<br>";
}
} /**
* Class SimpleFactory 工厂类
*/
class SimpleFactory
{
// 简单工厂里的静态方法-用于创建男人对象
static function createMan()
{
return new man();
}
// 简单工厂里的静态方法-用于创建女人对象
static function CreateWoman()
{
return new woman();
}
} /**
* 具体调用
*/
$man = SimpleFactory::createMan();
$man->say();
$woman = SimpleFactory::CreateWoman();
$woman->say();

单例模式

单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

单例模式是一种常见的设计模式,在计算机中,线程池,缓存,日志对象,对话框,数据库操作等常被设计成单例模式。

单例模式有以下几个特点:

(1)只能有一个实例

(2)必须自行创建这个实例

(3)必须给其他对象提供这一实例

使用单例模式的原因:

PHP一个主要的应用场合就是应用程序与数据库打交道的场景,在一个应用中会存在大量的数据库操作,针对数据库句柄链接数据库的行为,使用单例模式可以避免大量的new操作。因为每一次new操作都会消耗系统和内存的资源。

class single
{
private $name; // 声明一个私有的实例变量
private function __construct() // 声明私有构造方法 为了防止外部代码使用new来创建对象
{
}
static public $instance; // 声明一个静态变量(保证类中唯一的一个实例)
static public function getinstance() // 声明一个静态方法,用于检测是否有实例对象
{
if(!self::$instance) self::$instance = new self();
return self::$instance;
}
public function setname($n)
{
$this->name = $n;
}
public function getname()
{
return $this->name;
}
} $oa = Single::getinstance();
$ob = Single::getinstance();
$oa->setname('hello world');
$ob->setname('good morning');
echo $oa->getname();
echo $ob->getname();

注册模式

注册模式,解决全局共享和交换对象。已经创建好的对象,挂在某个全局可以直接使用的数组上,在需要使用的时候,直接在该数组上获取即可。

class Register
{
projected static $objects;
function set($alias,$object) // 将对象注册到全局的树上
{
self::$objects[$alias]=$object;
}
static function get($name)
{
return self::$object[$name]; // 获得某个注册到树上的对象
}
function __unset($alias)
{
unset(self::$object[$alias]); // 移除某个注册到树上的对象
}
}

适配器模式

将各种截然不同的函数接口封装成统一的API。

PHP中的数据库操作有MySQL,MySQLi,PDO三种,可以用适配器模式统一成一致,是不同的数据库操作统一成一样的API。类似的场景还有cache适配器,可以将memcache,redis等不同的缓存函数,统一成一致。

interface IDatabase
{
function connect($host,$user,$passwd,$dbnamne);
function query($sql);
function close();
} // MySQL
class MySQL implements IDatabase
{
protected $conn;
function connect($host,$user,$passwd,$dbname)
{
$conn = mysql_connect($host,$user,$passwd);
mysql_select_db($dbname,$conn);
$this->conn = $conn;
}
function query($sql)
{
$res = mysql_query($sql,$this->conn);
return $res;
}
function close()
{
mysql_close($this->conn);
}
} class MySQLi implements IDatabase
{
protected $conn;
function connect($host,$user,$passwd,$dbname)
{
$conn = mysqli_connect($host,$user,$passwd,$dbname);
$this->conn = $conn;
}
function query($sql)
{
return mysqli_query($this->conn,$sql);
}
function close()
{
mysqli_close($this->conn);
}
}

观察者模式

1、观察者模式:当一个对象状态发生变化时,依赖它的对象全部会收到通知并自动更新。

2、场景:一个事件发生后,要执行一连串更新操作。传统的编程方式就是在事件的代码之后直接加入处理的逻辑。当更新的逻辑增多之后,代码会变得难以维护。这种方式时耦合的,侵入式的,增加新的逻辑需要修改事件的主体代码。

3、观察者模式实现了低耦合,非侵入式的通知和更新机制。

定义一个事件触发抽象类

EventGenerator.php
<?php
require_once 'Loader.php';
abstract class EventGenerator{
private $observers = array();
function addObserver(Observer $observer){
$this->observers[]=$observer;
}
function notify(){
foreach ($this->observers as $observer){
$observer->update();
}
}
} Observer.php
<?php
require_once 'Loader.php';
interface Observer{
function update();//这里就是在事件发生后要执行的逻辑
}
//一个实现了EventGenerator抽象类的类,用于具体定义某个发生的事件 require 'Loader.php';
class Event extends EventGenerator{
function triger(){
echo "Event<br>";
}
}
class Observer1 implements Observer{
function update(){
echo "逻辑1<br>";
}
}
class Observer2 implements Observer{
function update(){
echo "逻辑2<br>";
}
}
$event = new Event();
$event->addObserver(new Observer1());
$event->addObserver(new Observer2());
$event->triger();
$event->notify();

最新文章

  1. Xcode的一个简单的UITests
  2. PowerShell 连接SQL
  3. jboss eap 6.3 集群(cluster)-Session 复制(Replication)
  4. LINQ之select方法选择多个字段
  5. 前端--json数据的处理及相关兼容问题
  6. 设置windows密码只存在NTLM-Hash下
  7. Atitit.软件GUIbutton与仪表盘--db数据库区--导入mysql sql错误的解决之道
  8. 关于前台主键输入错误对后台hibernate方法的影响
  9. 【转载】GPIO模拟i2c通信
  10. 自定义控件详解(七):drawText()
  11. 在vscode中使用eslint+prettier格式化vue项目代码 (转载)
  12. 《剑指offer》左旋转字符串
  13. 帮助Bsny(乱搞做法)
  14. 我的第一篇博客:vue-cli配置项目
  15. java实现《剑指offer》(一)1~10
  16. ECS之旅——常用的linux指令
  17. 菜鸟学步之 爆破AspriseOCR 4.0
  18. 使用配置hadoop中常用的Linux(ubuntu)命令
  19. MySQL索引覆盖
  20. Python3.x:os.path模块

热门文章

  1. C++学习之多重继承与虚继承
  2. 专訪印度电商Snapdeal CEO:学阿里还是京东
  3. Hadoop之父Doug Cutting:Lucene到Hadoop的开源之路
  4. [bzoj3274]Circle
  5. 实现https
  6. Gym - 101982A 2018-2019 ACM-ICPC Pacific Northwest Regional Contest (Div. 1) A. Exam
  7. $CF1141C Polycarp Restores Permutation$
  8. 题解报告:hdu 2516 取石子游戏(斐波那契博弈)
  9. CSS 样式的优先级(重要,一定要理解)
  10. PHP 在线 编辑 解析