PHP中的设计模式及其实际应用浅析

设计模式在各种语言中都有很重要的应用,每种设计模式都有其特有的优点以及使用场景。接下来,将从单例模式、工厂模式、组合模式以及策略模式四个模式,介绍设计模式及其实际项目中的简单应用。

一、单例模式

单例模式的作用是让这个类只能产生一个实例,适用于创建全局变量

控制一个类只能生成一个实例的方法就是设定静态方法

下面的单例模式示例,创建了web的配置类Config,使得整个web应用程序可以使用同一个配置对象:

<?php
class Config{
    static private $_instance = NULL;
    private $_settings = array();    //用来存储配置信息
    private function __construct(){}
    private function __clone(){}
    static function getInstance(){    //静态方法实例化类
        if(self::$_instance == NULL){
            self::$_instance = new Config();
        }
        return self::$_instance;
    }
    function set($index, $value){
        $this->_settings[$index] = $value;
    }
    function get($index){
            return$this->_settings[$index];
    }
}
?>

调用这个类:

<?php
require(“Config.php”);
$CONFIG = Config::getInstance();   //实例化第一个对象
$CONFIG->set(‘live’, ‘true’);
$TEST = Config::getInstance();   //实例化第二个对象
$TEST->get(‘live’);  //发现两个对象的live属性是相同的,说明实现了单例模式
 

如果一个用户调用new()或clone()方法,会创建多个实例,影响了单例模式,为了避免这样的问题,需要添加一个私有的构造函数:

private function __construct(){}

这样当用户调用new()方法创建的时候会报错

二、工厂模式

工厂模式用来创建多种不同类型的类的多个对象(不仅仅针对一个类,而是通过这个类可以创建许多其他类的对象)

例子:根据用户选择的图形,创建相应的图形

<?php
abstract class ShapeFactory(){
static function Create($type,array $size){
    switch($type){
        case ‘rectangle’:
              return new Rectangle($size[0], $size[1]);
              break;
        case ‘triangle’:
              return new Triangle($size[0], $size[1],$size[2]);
             break;
    }
}
}

上面的方法利用了之前定义好的各种图形类

调用:

<?php
if(isset($_GET[‘shape’], $_GET[‘dimensions’])){
$obj =ShapeFactory::Create($_GET[‘shape’], $_GET[‘dimensions’]);
//…一些输出操作
}
unset($obj);
?>

这个工厂类的功能实现了,它可以根据用户的输入进行不同类的创建

三、组合模式

组合模式适用于当我们的一个对象可能代表一个单一的实体,或者一个组合的实体,但是仍然需要通过同样的方式被使用的情形

比如表单中,对整个表单或者表单中的某个元素可能都需要执行相同的操作

组合模式从一个基类开始:

abstract class FormComponent{
abstract functionadd(FormComponent $obj);
abstract function remove(FormComponent$obj);   //以上两个是核心方法
}
//定义一个Form类
class Form extends FormComponent{
privates $_elements = array();
function add(FormComponent $obj){
    $this->_elements[] = $obj;
}
}
//定义一个FormElement类,可以加到Form中
class FormElement extends FormComponent{
function add(FormComponent $obj){
    return $obj;
}
}
//实例化form和formelement对象,并将formelement对象添加到form中
$form = new Form();
$email = new FormElement();
$form->add($email);  //向form中添加元素

四、策略模式

策略模式可以根据用户的选择执行不同的方法

当我们使用的类比较简单,但是又相互不关联,只是在特定行为上有所差异的场景下,策略模式就会十分有用

比如对字符串的过滤,有两种过滤模式:

1.      取出HTML多余的空格(HtmlFilter)

2.      过滤脏话(SwearFilter)

先定义一个过滤接口Filter,上面两个方法是对这个接口的实现

interface Filter{
    functionfilter($str);
}
class HtmlFilter implements Filter{
function filter($str){
    //实现该功能的代码
    return $str;
}
}
class SwearFilter implements Filter{
function filter($str){
    //实现该功能的代码
    return $str;
}
}

另外还需要实现一个类来使用这些过滤器:

class FormData{
private $_data = NULL;
function __construct($input){
    $this->_data = $input;
}
function process(Filter$type){  //这个方法传入一个Filter类型的对象,根据出入对象选择方法
    $this->_data =$type.filter($this->_data);   //使用选择的方法进行过滤
}
}

使用这个策略模式的方法如下:

$form = new FormData($someUserInput);  //创建一个执行表单过滤的对象
$form->process(new HtmlFilter());  //调用process方法执行过滤

以上就是四种基本设计模式的介绍以及实际应用的方法,多利用设计模式可以让我们更方便的实现功能,同时让代码变得更加优雅。

时间: 04-25

PHP中的设计模式及其实际应用浅析的相关文章

使用Micrisoft.net设计方案 第一章 企业解决方案中构建设计模式

第一章企业解决方案中构建设计模式 我们知道的系统总是由简单到复杂,而不是直接去设计一个复杂系统.如果直接去设计一个复杂系统,结果最终会导致失败.在设计系统的时候,先设计一个能够正常工作的系统,然后在此基础上逐步扩展.而一个好的企业设计方案就是由一些短小.简单.可靠.有效的并能够解决问题的机制组成.由这些短小精悍的机制进行组合,形成复杂的系统.而这些机制就设计模式.设计模式就是能够记录这些机制的一些描述. 企业级业务解决方案一般是复杂.性能要好.可扩展性好以及容易维护和可伸缩性强,而设计模式可以帮

C#中ref和out的区别浅析

这篇文章主要介绍了C#中ref和out的区别浅析,当一个方法需要返回多个值的时候,就需要用到ref和out,那么这两个方法区别在哪儿呢,需要的朋友可以参考下 在C#中通过使用方法来获取返回值时,通常只能得到一个返回值.因此,当一个方法需要返回多个值的时候,就需要用到ref和out,那么这两个方法区别在哪儿呢? MSDN:       ref 关键字使参数按引用传递.其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中.若要使用 ref 参数,则方法定义和调用方法都必

面向对象编程中的设计模式

面向对象编程中的设计模式 最近在复习(预习)软考,看到了设计模式这个知识点,打算小做总结一下~~ 设计模式分为三种类型,共23种.(红色标注常用的) 创建型模式:单例模式.抽象工厂模式.建造者模式.工厂模式.原型模式. 结构型模式:适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式. 行为型模式:模版方法模式.命令模式.迭代器模式.观察者模式.中介者模式.备忘录模式.解释器模式(Interpreter模式).状态模式.策略模式.职责链模式(责任链模式).访问者模式.

Spring中的设计模式

[Spring中的设计模式] http://www.uml.org.cn/j2ee/201301074.asp [详解设计模式在Spring中的应用] [http://www.geek521.com/?p=6883] [http://blog.csdn.net/fg2006/article/details/6435410] [http://ylsun1113.iteye.com/blog/828542 ] 1.简单工厂  又叫做静态工厂方法(StaticFactory Method)模式,但不属

[Android]GOF23种设计模式 &amp; Android中的设计模式

GOF23种设计模式 设计原则: 1. 单一职责原则(SRP):就一个类而言,应该仅有一个引起它变化的原因 2. 开放-封闭原则(OCP):软件实体(类.模块.函数等)应该可以扩展,但是不可修改.即对于扩展是开放的, 对于修改是封闭的. 3. 依赖倒转原则: A. 高层模块不应该依赖低层模块,两个都应该依赖抽象.B.抽象不应该依赖细节,细节应该依赖抽象.说白了,就是要针对接口编程,不要对实现编程. 4. 迪米特法则(LoD):如果两个类不必彼此直接通信,那么这两个类就不应该发生直接的相互作用.如

转载:C#中ref和out的区别浅析

这篇文章主要介绍了C#中ref和out的区别浅析,当一个方法需要返回多个值的时候,就需要用到ref和out,那么这两个方法区别在哪儿呢,需要的朋友可以参考下 在C#中通过使用方法来获取返回值时,通常只能得到一个返回值.因此,当一个方法需要返回多个值的时候,就需要用到ref和out,那么这两个方法区别在哪儿呢? MSDN:        ref 关键字使参数按引用传递.其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中.若要使用 ref 参数,则方法定义和调用方法都

Java中单态设计模式

Java中单态设计模式 2011-09-23 16:38:46|  分类: Java |  标签:technology!  |举报|字号 订阅 此博文是转自新浪博客中一名叫做"俊俊的BLOG“用户的一篇博文.感觉此博文确实很不错,所以在此拿出来分享一下!(笔者只是对其所举的代码略做了一些修改) 一概念: 设计模式:设计模式是指经过大量的实践总结和理论化之后的优选的代码结构.编程风格.以及解决问题的思路. 单态设计模式:采取一定的方法保证在整个软件系统中,对某个类只能产生一个对象实例,并且该类只提

[程序示例]Objective-C中的委托设计模式(牛仔与姑娘)

今天整理电脑翻到以前自学Objective-C时写的一个练习委托设计模式的一个小程序,就po上来和大家分享,顺便自己也复习一下OC中的委托. Objective-C中的委托设计模式是和协议分不开的. 协议呢,就是使用了这个协议后就要按照这个协议来办事,协议要求实现的方法就一定要实现.(在Objective-C2.0中可以在协议里选择是否必须实现某种方法,用关键字@optional和@required) 委托的话,顾名思义就是自己处理不了的事情,委托他人按照协议里写好的条款来办理这件事. 具体实现

访何红辉:谈谈Android源码中的设计模式

最近Android 6.0版本的源代码开放下载,刚好分析Android源码的技术书籍<Android源码设计模式解析与实战>上市,我们邀请到它的作者何红辉,来谈谈Android源码中的设计模式,以及近期Android开发中的一些热点话题. 受访嘉宾介绍: 何红辉(@MrSimp1e),前友盟Android工程师,活跃于国内各大技术社区,热爱开源,热爱技术,热爱分享.Android开源库 AndroidEventBus . Colorful 作者, 开发技术前线 站长,<Android源码