一. 学习设计模式之前的准备工作
学习设计模式之前需要了解使用至少一门面向对象的编程语言,本文以php作为语言基础。如果读者对面向对象知识匮乏。例如对继承,多态,抽象的理解不足,造成阅读的困难,不妨去补充相关知识再来阅读。
二. 注意事项
Q: 学习了设计模式以后常常会过度设计正常吗?
A: 暂时现象
三. 设计模式普遍流程
在使用设计模式时往往需要考虑到下面几个流程实现
(1) 业务封装
如: 业务逻辑和页面逻辑分开。
(2) 分离
将一个要设计的对象根据面向对象的思想,提取出共同的属性和方法。一般先使用虚类来规划一个类的蓝图。配合着接口的实现来构造一个具体的基类。在子类中根据不同的使用场景将其虚方法重写成自己需要的方法。
分离的好处是一个完整且正常的项目,如果想要对其中一个功能进行修改,那么只需要修改这个类(类文件),而不需要改动其他无关联的代码,影响其正常功能的使用。而且在文件结构上也更加清晰。
(3) 实现不同的设计模式
在(1) (2)的基础上进行不同设计模式的实现。根据不同的使用场景,单独或交叉的使用一个或多个设计模式。来减少代码的耦合度,提高代码的可读性复用性。
四. 简单工厂设计模式理论
概括:使用工厂类针对不用的需求来生成不同的对象,将生成的对象返回使用。
ex:比如多啦a梦的万能口袋。我们都知道多啦a梦想要什么它的万能口袋就会拿出对应它想要的东西出来。流程大约是这样的:
这个口袋就起到了工厂的作用,用行话来说就是用工厂方法来代替来new 对象的操作。是用单独的类来做创造实例的过程,这就是工厂。
五. 简单工厂设计模式的具体实践
说了那么多,还是要具体落实到响应的代码中。这里是一个加减法的简单工厂实现:
<?php
# 抽象类
abstract class Operation{
protected $number_A = 0;
protected $number_B = 0;
# 构造方法
function __construct(int $A, int $B)
{
$this->number_A = $A;
$this->number_B = $B;
}
# 抽象方法 用于获取计算结果的方法
abstract function getResult():int;
}
# 加法
class Add extends Operation{
# 抽象方法的实践
function getResult():int{
$result = $this->number_A + $this->number_B;
return $result;
}
}
# 减法
class Sub extends Operation{
# 抽象方法的实践
function getResult():int{
$result = $this->number_A - $this->number_B;
return $result;
}
}
class Factory{
private $opertionObj = NULL;
# 构造方法
function __construct(int $A, string $operation, int $B)
{
if($operation === "+"){
$this->opertionObj = new Add($A, $B);
}
if($operation === "-"){
$this->opertionObj = new Sub($A, $B);
}
}
function generateOperation(): Operation{
return $this->opertionObj;
}
}
$operationAddObj = new Factory(5,"+",6);
$operationSubObj = new Factory(5,"-",6);
echo $operationAddObj->generateOperation()->getResult();
echo "<br />";
echo $operationSubObj->generateOperation()->getResult();
?>
code Out:
11
-1