PHP设计模式.doc
上传人:sy****28 上传时间:2024-09-14 格式:DOC 页数:7 大小:66KB 金币:16 举报 版权申诉
预览加载中,请您耐心等待几秒...

PHP设计模式.doc

PHP设计模式.doc

预览

在线预览结束,喜欢就下载吧,查找使用更方便

16 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

PHP设计模式可能一直都以为设计模式只是为Java架构师准备的,实际上,设计模式对于每个人都非常有用。为什么说它们在PHP应用程序中也非常有用?接下来让我来解释这些问题。设计模式不仅代表着更快开发健壮软件的有用方法,而且还提供了以友好的术语封装大型理念的方法。用较小的示例展示设计模式的价值与功用是非常困难的。这往往有些大材小用的意味,因为模式实际上是在大型代码库中发挥作用的。既然已经了解了设计模式以及它们的有用之处,现在我们来看看PHP5的几种常用模式。工厂模式(FactoryPattern)工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。(JAVA中工厂模式分为:简单工厂模式、工厂方法模式、抽象工厂模式)工厂就是负责生成对象的类或方法。工厂模式解决了当代码关注于抽象类型时如何创建对象实例的问题。在最初的设计模式一书中,许多设计模式都鼓励使用松散耦合。如何理解这个概念?在项目开发中更改一个代码片段时,就会发生问题,而且往往认为完全不相关的部分也可能出现级联破坏。该问题在于紧密耦合。如果类之间有非常强的依赖性,那么这样的系统就很难维护,因为系统里的一个改动会引起一连串的相关改动。所以我们需要一组模式使这些类之间能够相互通信,但不希望它们紧密绑定在一起,以避免出现联锁反应(严格意义上讲是叫解耦)。在大型系统中,许多代码依赖于少数几个关键类。需要更改这些类时,可能会出现困难。例如,假设您有一个从文件读取的User类,您希望将其更改为从数据库读取的其他类,但是,所有的代码都引用从文件读取的原始类,这时候,使用工厂模式会很方便。举例说明:<?phpabstractclassIUser{//抽象产品角色abstractfunctiongetName();}classUserextendsIUser{//具体产品角色publicfunctiongetName(){return'Jack';}}classUserFactory{//工厂类角色staticpublicfunctioncreate(){returnnewUser();//返回实例}}$uo=UserFactory::create();echo$uo->getName();?>在简单工厂模式中,一个工厂类处于对产品实例化调用的中心位置上,它决定哪一个产品类应当被实例化,如同一个交通警察站在来往的车辆流中,决定放行哪一个方向的车辆前行。工厂模式的三种角色:工厂角色(Creator):这是本模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。抽象产品角色(Product):工厂模式所创建的所有对象的父类。它负责描述所有实例所共有的公共接口。(一般由接口或抽象类来实现)。具体产品角色(ConcreteProduct):是工厂模式创建的目标,所有创建的对象都是充当这个角色的某个具体类的实例。(由一个具体类实现)工厂模式的优缺点:优点:简单实用利于软件体系结构优化缺点:违反高内聚责任分配原则模块功能容易蔓延,不利于系统维护有时此类模式在规模较小的环境中似乎有点大材小用,不过,最好还是学习这种扎实的编码形式,以便应用于任意规模的项目中。二、单例模式(SingletonPattern单件模式或单元素模式)单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。单例模式是一种常见的设计模式,在计算机系统中,线程池、缓存、日志对象、对话框、打印机、数据库操作、显卡的驱动程序常被设计成单例。单例模式分3种:懒汉式单例、饿汉式单例、登记式单例。单例模式有以下3个特点:只能有一个实例。必须自行创建这个实例。必须给其他对象提供这一实例。那么为什么要使用PHP单例模式?PHP一个主要应用场合就是应用程序与数据库打交道的场景,在一个应用中会存在大量的数据库操作,针对数据库句柄连接数据库的行为,使用单例模式可以避免大量的new操作。因为每一次new操作都会消耗系统和内存的资源。在以往的项目开发中,没使用单例模式前的情况如下://初始化一个数据库句柄$db=newDB(...);//比如有个应用场景是添加一条用户信息$db->addUserInfo();......//然而我们要在另一地方使用这个用户信息,这时要用到数据库句柄资源,可能会这么做......functiontest(){$db=newDB(...);$db->getUserInfo();......有些朋友也许会说,可以直接使用global关键字!global$db;...