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 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!