PHP 设计模式
思考:个人觉得我们没有必要去死背硬记每一个模式,而是学会去理解什么场景下应该用什么模式,也就是说任何模式都是一个用来去解决某些场景来产生的方法思路。
一、简单工厂模式(学习来源于git,供自己学习记忆)
1、使用场景:假如您正在盖房子,那么你需要门。您既可以选择自己穿上木匠的衣服,带些木头,胶水,钉子和所有用来建造门的工具家中建造它,也可以直接致电工厂并把建造好的门交付给您,无需了解有关制作门的任何知识。
2、简而言之:只需为客户端生成一个实例,而无需向客户端公开任何实例化逻辑
3、代码展现:
interface Door // 首先不管是什么门,要有一个基本的门的定义接口
{
public function getWidth(): float;
public function getHeight(): float;
}
//然后我们定义一个木门,它实现了门这个接口,有高,有宽
class WoodenDoor implements Door
{
protected $width;
protected $height;
public function __construct(float $width, float $height)
{
$this->width = $width;
$this->height = $height;
}
public function getWidth(): float
{
return $this->width;
}
public function getHeight(): float
{
return $this->height;
}
}
// 第三步、创造一个工厂类,来按我们的门类进行创造门
class DoorFactory
{
// 这里做一个解释,为什么在工厂类里要写一个makeDoor的方法呢,而不是直接去new WoodenDoor的方法呢,个人的理解是,一个工厂肯定不单单只有造门一个功能,也可能会想要一个修改门的的功能,所以不通的功能单元用不同的方法是最好的实现方式
public static function makeDoor($width, $height): Door
{
return new WoodenDoor($width, $height);
}
}
// 第四步,就是我们通过调用工厂的制作门的方法来
// Make me a door of 100x200
$door = DoorFactory::makeDoor(100, 200);
echo 'Width: ' . $door->getWidth();
echo 'Height: ' . $door->getHeight();
// Make me a door of 50x100
$door2 = DoorFactory::makeDoor(50, 100);
4、总结:就是你要A,工厂给你实例化一个A,你要B,工厂给你实例化一个B。
二、工厂模式
1、场景:招聘经理招聘新员工。它不可能对每个职位进行面试。所以根据职位空缺,她必须决定面试步骤并将其委托给其他人。
2、简而言之:它提供了一种将实例化逻辑委托给子类的方法。
3、代码实现:
// 第一步、实现一个面试官的接口,功能是提问题
interface Interviewer
{
public function askQuestions();
}
// 接下来是有两个类分别实现该接口:
// 这个是开发者,是针对设计实现的类
class Developer implements Interviewer
{
public function askQuestions()
{
echo 'Asking about design patterns!';
}
}
// 这个类是针对社交建设实现的类
class CommunityExecutive implements Interviewer
{
public function askQuestions()
{
echo 'Asking about community building';
}
}
// 第二步是创建一个招聘经理的抽象类,它具有的功能是分配适合的面试官,并让提问题(面试)
abstract class HiringManager
{
// Factory method
abstract protected function makeInterviewer(): Interviewer;
public function takeInterview()
{
$interviewer = $this->makeInterviewer(); //这里的makeInterview()的作用在第三步可以看到,其实就是对其他类的对象创建(实例化)操作
$interviewer->askQuestions();
}
}
// 第三步、用不同的子类去继承扩展这个抽象类
class DevelopmentManager extends HiringManager //开发管理者
{
protected function makeInterviewer(): Interviewer
{
return new Developer();
}
}
class MarketingManager extends HiringManager // 行政管理者
{
protected function makeInterviewer(): Interviewer
{
return new CommunityExecutive();
}
}
第四步、就是调用不同的类,进行实际的调用
$devManager = new DevelopmentManager();
$devManager->takeInterview(); // Output: Asking about design patterns
$marketingManager = new MarketingManager();
$marketingManager->takeInterview(); // Output: Asking about community building.
4、总结:我有一个总的工厂接口,假如有A和B两个产品,那么我就实现两个子工厂,一个实例化A,一个实例化B,一个总工厂拥有多个子工厂,而子工厂和产品是一一对应的关系,即一个工厂只实现一种产品。
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: