PHP中的三种基本设计模式

既然学习了PHP的面向对象编程,那么学习设计模式就是必然的了

前几天一直在看关于设计模式的教程和书籍,我理解的设计模式就是一种思想,让编程变得更加有条理,更加聪明,通过学习设计模式发现自己的不足,原来代码是可以这样子滴!

  1. 工厂模式
  2. 单例模式
  3. 注册树模式

1.工厂模式

什么是工厂模式呢,光看概念的话肯定是不容易理解的那么就用代码说话:

<?php
header('Content-Type:text/html;charset=utf-8');
/*
 * 简单的创建一个计算器例子
 */
//首先定义一个抽象类用来实现+,-,*,/ 操作的运算
abstract class Operation {
    abstract public function getValue($num1, $num2);
}
//定义各个算法的类
class OperationAdd extends Operation {
    //实现抽象类中的getValue()方法
    public function getValue($num1, $num2) {
        return $num1 + $num2;
    }
}
class OperationSub extends Operation {
    public function getValue($num1, $num2) {
        return $num1 - $num2;
    }
}
class OperationMut extends Operation {
    public function getValue($num1, $num2) {
        return $num1 * $num2;
    }
}
class OperationDiv extends Operation {
    public function getValue($num1, $num2) {
        try {
            if($num2 == 0) {
                throw new Exception("被除数不能为0");
            }else {
                return $num1 / $num2;
            }
        }catch(Exception $e) {
            echo $e->getMessage();
        }
    }
}
//各种算法已经定义好了,那么如何根据不同的符号判断创建不同的对象呢,这就用到了我们的工厂类
class Factory {
    public static function createObj($operation) {
        switch($operation) {
            case '+':
                return new OperationAdd();
                break;
            case '-':
                return new OperationSub();
                break;
            case '*':
                return new OperationMut();
                break;
            case '/':
                return new OperationDiv();
                break;
        }
    }
}
//我们只要这样使用工厂类
$testAdd = Factory::createObj('+');
$resultAdd = $testAdd->getValue(1, 4);
echo $resultAdd;
?>

那么使用工厂类有什么优点呢?
首先,可扩展性大大增强了,如果我想要添加一个取余的操作,只需要增加一个取余的算法类,然后在工厂模式里增加一个判断,而不用去动其他的部分。
其次,易维护性,如果这是一个工资系统呢,我想让程序员增加一个扣税操作,如果不使用这种模式我就需要把所有的代码交给他,只要在加法的操作里加一个判断,if(name==’zjp’) 多加100块(少加点,要不然该被抓了,开玩笑的)。如果我使用了工厂模式,他只需要增加一个类就可以了,也不需要去阅读大量的代码,增加更多的判断。

2.单例模式

单例模式就是只生成一个对象,不会重复的生产对象,比如数据库连接,如果我生产很多连接那么会很耗费资源,这时就需要用到单例模式了。还是用代码说话:

<?php

class Single {
/*
 * 定义一个变量存储对象
 * 注意,如果获取对象得方法是static方法,变量也要用static变量
 */
public static $single;
//定义一个私有的构造函数,目的是防止外部实例化
private function __construct() {
}
//定义一个实例化自己的方法
public static function getInstance() {
    //如果对象已经存在了就直接返回存在变量里的对象,而不去重新创建。instanceof 是判断前面的对象是否是后面类的实例化
    if(self::$single instanceof self) {
        return self::$single;
    }
    self::$single = new self();
    return self::$single;
}
}
?>

3.注册树模式

注册树模式就是,当我生成一个对象得时候,我就把这个对象插到我的树上,等我再需要这个对象得时候直接从树上拔下来就好了,这里我们的树其实就是一个二维数组,key值是我们插到树上的标记,value就是对象。代码说话:

class Register {
    //定义一个变量
    protected static $objects;
    //将对象插到树上
    public static function set($alias, $object) {
        self::$objects[$alias] = $object;
    }
    //将对象取出来
    public static function get($alias) {
        return self::$objects[$alias];
    }
    //将对象销毁
    public static function _unset($alias) {
        unset(self::$objects[$alias]);
    }

}

那么这三种模式如何结合起来呢?

其实很简单,我们要做的就是使用工厂类生产出单例模式的对象,然后插到树上

//工厂类
class Factory {
    public static function toNew() {
        return Single::getInstance();
    }
}
//单例模式和注册树模式就是用前面的两个类
//把对象注册到$zjp上
Register::set('zjp', Factory::toNew());
//取出对象
$zjp = Register::get('zjp');
print_r($zjp);
//好啦,大家可以打印出这个$zjp,看一看到底是不是Single的对象
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值