欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

PHP设计模式、工厂模式讲解

程序员文章站 2022-05-01 17:37:13
工厂模式 工厂方法或类生成对象,而不是直接在代码中new 单例模式 使某个类仅创建一次,防止数据库的连接多次,造成资源浪费 声明非公开的成员属性,用户判断 构造方法私有化...

工厂模式

工厂方法或类生成对象,而不是直接在代码中new

单例模式

使某个类仅创建一次,防止数据库的连接多次,造成资源浪费

声明非公开的成员属性,用户判断

构造方法私有化

声明静态的公有方法,来实例对象

protected $db

private function __construct(){}

static function getInstace(){

if(self::$db){

return self::$db;

}else{

self::db=new self;

return self::db;

}

}

注册树模式

将实例化的对象存储在树上(即一个数组变量),每次使用必须在使用单例模式判断,直接调取注册树中存储的对象即可

class Register{

protect static $objects;

static function set($alias,$object){

self::$objects[$alias]=$object;

}

static function get($alias){

return self::$object[$alias];

}

function __unset(){

unset(self:$object[$alias]);

}

}

适配器模式

可以将截然不同的函数接口封装称统一的api

实际应用举例:php的数据库三种操作封装,cache适配器

建立一个接口类,让这些不同的全部继承接口类去实现具体的方法

interface IDatabase{

function connect($host,$user,$passed,$dbname)

function query($sql);

function close();

}

class Mysqli implements IDatabase{

protected $conn;

function connect($host,$user,$passed,$dbname){

$conn=mysqli_connect($host,$user,$passed,$dbname);

$this->conn=$conn;

}

function query($sql){

return mysqli_query($this->conn,$sql);

}

function close(){

mysqli_close($this->conn);

}

}

new 命名空间/类名 调用

这里可以直接写一个工厂方法实例化,这样就只需要传参数就行了

策略模式

PHP策略模式

UserStateagy.php策略的接口文件:约定策略的所有行为

FemaleUserStrategy.php实现接口的所有方法

MaleUserStragy.php实现接口的所有方法

调用

class Page{

protected $strategy;

function index(){

echo “AD”;

$this->strategy->showAd();

echo “

”;

echo “Category”;

$this->straregy->showCategory()

}

function setStrategy(\IMooc\UserStrategy $strategy){

$this->strategy=$srategy;

}

}

$page=new Page();

if(isset($_GET[‘female’])){

$strategy=new?

}else{

$strategy=new?

}

$page->setStrategy($strategy);(以策略对象为参数进行策略传递)

$page->index();

数据对象映射模式

数据映射对象模式,是将对象和数据存储映射起来,对一个对象的操作会映射为对数据存储的操作

生成一个数据对象操作表的类,使用的时候,直接new会乱,所以就使用工厂方法,但是工厂方法创建了两个对象,所以就使用注册器模式把对象注入,就只使用一个了。

观察者模式

事件产生者

EventGenerator.php

abstract class EventGenerator{

private $observer=array();

function addObserver(Oberver $observer){

$this->observers[]=$observer;

}

function notify(){

foreach($this->observers as $observer){

$observer->update();

}

}

}

观察者接口

interface Observer{

function update();

}

执行

class Event extends EventGenrator{

function trigger(){

echo “event”;

$this->notify()

}

}

class Observer1 implements Observer{

function update(){

echo “逻辑一”;

}

}

$event=new Event;

$event->addObserver(new Observer1);

$event->trigger();

原型模式:通过clone来在内存拷贝大对象,节约开销

原型模式与工厂模式作用类似,用来创建对象,先创建好一个原型对象,然后通过clone原型对象来创建新的对象,就免去了类创建时重复的初始化操作,原型模式仅适用于大对象的创建,创建一个大对象需要很大的开销,如果每次new都会消耗很大,原型模式仅需内存拷贝即可

装饰器模式 可以动态的添加修改类的功能,一个类提供了一项功能,如果要在修改并添加额外的功能,传统的编程模式,需要写一个字类继承它,并重新实现类的方法,使用装饰器模式,仅需在运行时添加个装饰器对象即可实现,可以实现最大的灵活性

迭代器模式?

在不需要了解内部实现的前提下,遍历一个聚合对象的内部元素,相比传统的编程模式,迭代器模式可以隐藏遍历元素的操作

接口Iterator

current()返回当前元素

key()返回当前元素的键

next()向前移动到下一个元素

rewind()返回到迭代器的第一个元素

valid()检查当前位置是否有效

代理模式

数据库的读写分离

分离读操作和写操作的时候,设置个代理,里面实现获取和更新操作,然后直接实例化调用相关方法

class Proxy implements IUserProxy{

function getUserName($id){

$db=Factory::getDatabase(slave)

}

function setUserName($id,$name){

Factory::getDatabase(’master’)

}

}