社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
友情链接:
一看就懂系列之 php设计模式(零)
一看就懂系列之 php设计模式(一)
一提到设计模式,很多人都是敬而远之,一方面由于设计模式有一点忽悠太理论的感觉,另一方面也会觉得设计模式有点难懂不知道该在什么场景下使用。一看就懂系列之php设计模式,主要解决两个问题:
1.用最通俗的话来讲讲设计模式是什么。
2.设计模式到底可以在哪些地方可以用上,顺利装逼成功。
我的理解
1.一个类一个实例;
2.这个实例必须自行创建;
3.向整个系统提供这个实例
使用姿势
1.数据库应用(缓存):一个系统中会有大量的数据库操作,面对对象开发时候,如果每个地方都去new一个实例,会消耗大量资源并且连接数据库也需要成本的,此时就需要使用单例模式
,全局一个实例,减少数据库连接就不容易出现too many connections情况。
2.全局配置信息:每个系统都会有全局的配置信息,会在多处调用,这时候可以定义一个全局配置类,使用单例模式
来实例化一个类进行读取与设置。
伪代码实现
/**
* 设计模式之单例模式
* $_instance必须声明为静态的私有变量
* 构造函数必须声明为私有,防止外部程序new类从而失去单例模式的意义
* getInstance()方法必须设置为公有的,必须调用此方法以返回实例的一个引用
* ::操作符只能访问静态变量和静态函数
* new对象都会消耗内存
* 使用场景:最常用的地方是数据库连接。
* 使用单例模式生成一个对象后,该对象可以被其它众多对象所使用。
*/
class man
{
//保存例实例在此属性中
private static $_instance;
//构造函数声明为private,防止直接创建对象
private function __construct()
{
echo '我被实例化了!';
}
//单例方法
public static function get_instance()
{
var_dump(isset(self::$_instance));
if(!isset(self::$_instance))
{
self::$_instance=new self();
}
return self::$_instance;
}
//阻止用户复制对象实例
private function __clone()
{
trigger_error('Clone is not allow' ,E_USER_ERROR);
}
function test()
{
echo("test");
}
}
// 这个写法会出错,因为构造方法被声明为private
//$test = new man;
// 下面将得到Example类的单例对象
$test = man::get_instance();
$test = man::get_instance();
$test->test();
// 复制对象将导致一个E_USER_ERROR.
//$test_clone = clone $test;
我的理解
1.抽象基类,在类中抽象一些方法,在不同的子类中进行实现。
2.继承抽象积累的子类,实现基类中的抽象方法
3.工厂类,实例化所有子类,以供调用。
使用姿势
1.当一个模块有许多相似的功能的时候,可以使用工厂模式,以避免代码耦合。
伪代码实现
/**
*
* 定义个抽象的类,让子类去继承实现它
*
*/
abstract class Operation{
//抽象方法不能包含函数体
abstract public function getValue($num1,$num2);//强烈要求子类必须实现该功能函数
}
/**
* 加法类
*/
class OperationAdd extends Operation {
public function getValue($num1,$num2){
return $num1+$num2;
}
}
/**
* 减法类
*/
class OperationSub extends Operation {
public function getValue($num1,$num2){
return $num1-$num2;
}
}
/**
* 乘法类
*/
class OperationMul 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($operate){
switch ($operate){
case '+':
return new OperationAdd();
break;
case '-':
return new OperationSub();
break;
case '*':
return new OperationSub();
break;
case '/':
return new OperationDiv();
break;
}
}
}
$test=Factory::createObj('/');
$result=$test->getValue(23,0);
echo $result;
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!