从事php后台的开发已经一年多了,慢慢的对CI等php框架有了越来越深入的了解,而开发的项目也是建立在php的框架之上,渐渐对底层的一些设计模式没有多少概念,最近在学习php的设计模式,发现框架其实是对大多的这些设计模式进行封装,同时又有些设计模式没有被利用,今天我就来给大家分享这几天学习php设计模式的一些心得。
1.工厂模式
工厂模式,顾名思义,将重复的操作封装到一个类一个方法里,一个是利于代码的复用性,也同时降低了代码维护的成本。以下贴出其简单的代码实例:
<span style="font-size:18px;"><?php
class Factory
{
static function createDatabase()
{
$db = new Database;
return $db;
}
}
//项目中代码中引用方法
Factory::createDatabase();
?></span>
2.单例模式
这种设计模式,可以配合工厂模式使用,设想这样一个应用场景,class Database,封装了数据的操作方法,而我们的业务逻辑中,几乎每一个地方都会使用到链接数据库的操作,传统的做法中,我们会不断的$db = new Database;
这样对服务器带来不小的开销。因此对于这样频用的类,不允许多次创建,而是只允许创建一次,复用对象。
<?php
class Database
{
protected $db;
//关闭Database new的创建方式
private function __construct()
{
}
//获得database对象的唯一入口
static function getInstance()
{
if(self::$db)
return self::$db;
else {
self::$db = new self();
return self::$db;
}
}
}
?>
3.注册树模式
类似上面的两种设计模式,也是为了减少对象的创建,降低服务器的压力。在注册树模式当中,我们建议,将所有创建过的对象存储起来,我们可以在接下来的业务逻辑中,自由的调用。
<?php
class Register
{
protected static $objects;
static function set($alias, $object)
{
self::$objects[$alias] = $objecct;
}
static function get($name)
{
return self::$objects[$alias];
}
static function _unset($alias)
{
unset(self::$objects[$alias]);
}
}
?>
4.策略模式
这种设计模式,改变了在业务逻辑开发中,繁琐的if...else的使用,假设这样一个场景:在某个业务逻辑中,我们需要对不同身份的用户提供不同样的业务展示,那么我们需要使用if..else的语法来区分开不同身份,那么,如果身份的增加在代码的实现上,整个设计就会变得复杂而失逻辑。那么让我们看看策略模式吧
1)首先呈现不同的业务,但是符合相同的接口
interface UserStrategy{
function showAd();
function showLink();
}
2) 根据不同的身份编写不同的接口(此处身份就以男性、女性为例)
<?php
class FemaleUserStrategy implements UserStrategy{
function showAd(){
echo "2015新款女装";
}
function showLink(){
echo "www.taobao.com";
}
}
?>
<?php
class MaleUserStrategy implements UserStrategy{
function showAd(){
echo "Ipad";
}
function showLink(){
echo "www.jd.com";
}
}
?>
3)统一调度方式
<?php
class Page{
protected $strategy;
function index()
{
echo "AD:";
$this -> strategy ->showAd();
echo "Link:"
$this -> strategy ->showLink();
}
}
$page = new Page;
if (isset($_GET['female'])){
$strategy = new FemaleUserStrategy();
}else {
$strategy = new MaleUserStrategy();
}
?>