标签:
设计模式在各种语言中都有很重要的应用,每种设计模式都有其特有的优点以及使用场景。接下来,将从单例模式、工厂模式、组合模式以及策略模式四个模式,介绍设计模式及其实际项目中的简单应用。
一、单例模式
单例模式的作用是让这个类只能产生一个实例,适用于创建全局变量
控制一个类只能生成一个实例的方法就是设定静态方法
下面的单例模式示例,创建了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方法执行过滤
标签:
原文地址:http://blog.csdn.net/fareise/article/details/51227403