PHP设计模式之工厂模式(2)

回顾工厂模式

场景:乘坐交通工具,有开车、有开飞机、有开火车

我们先看看不用工厂模式,如何做的

 1 <?php
 2 namespcae Demo2;
 3 //假设脚本1 Car.php
 4 // 汽车类
 5 class Car
 6 {
 7   public function drive(){
 8         return ‘开车‘;
 9     }    
10 }
11 //脚本2 Plane.php
12 // 飞机类
13 class Plane
14 {
15   public function drive(){
16         return ‘开飞机‘;
17     }  
18 }
19 //脚本3 Train.php
20 class Train
21 {
22     public function drive(){
23         return ‘开火车‘;
24     }
25 }
26 //脚本4 Travel.php
27 <?php
28 namespace Demo2;use ...;
29 //在一个文件A中调用另一个文件B的类需要加载B文件,这里使用自动加载 
30 require __DIR__ . ‘autoload.php‘;
31 // 旅行
32 class Travel
33 {
34     private $vehicle;
35     public function __construct($vehicle){
36         switch(strtolower($vehicle)){
37             case ‘car‘:
38                $this->vehicle = new Car();
39                 break;
40             case ‘train‘:
41                 $this->vehicle = new Train();
42                 break;
43             case ‘plane‘:
44                 $this->vehicle = new plane();
45                 break;
46        }
47     }
48     public function travelMove(){
49         // 传统做法就是new 对象
50         return $this->vehicle->drive().‘去上班‘
51     }
52 }
53 // 调用
54 echo (new Travel(‘car‘))->travelMove() . PHP_EOL;//开车去上班
55 echo (new Travel(‘train‘))->travelMove() . ‘<br>‘;//开火车去上班
56 echo (new Travel(‘plane‘))->travelMove();//开飞机去上班

使用工厂模式

<?php
 namespcae Demo2;
 //假设脚本1 Car.php
 // 汽车类
 class Car
 {
   public function drive(){
         return ‘开车‘;
     }    
 }
 //脚本2 Plane.php
 // 飞机类
 class Plane
 {
   public function drive(){
         return ‘开飞机‘;
     }  
 }
 //脚本3 Train.php
 class Train
 {
     public function drive(){
         return ‘开火车‘;
     }
 }
 //脚本4 Travel.php
 <?php
 namespace Demo2;
user ...;
 //在一个文件A中调用另一个文件B的类需要加载B文件,这里使用自动加载
 require __DIR__ . ‘autoload.php‘;
// 工厂类
class Factory
{
    private $instance = null;
    public static function create(){
        switch(strtolower($vehicle)){
             case ‘car‘:
                $this->instance = new Car();
                 break;
             case ‘train‘:
                 $this->instance = new Train();
                 break;
             case ‘plane‘:
                 $this->instance = new plane();
                 break;
        }
        return $this->instance;
    }
}
 // 旅行
 class Travel
{
     private $vehicle;
     public function __construct($vehicle=null){
        // 将原来依赖三个类,变成了依赖一个工厂类
        $this->vehicle = Factory::create($vehicle);
    }
     public function travelMove(){
         // 传统做法就是new 对象
         return $this->vehicle->drive().‘去上班‘
     }
}
// 调用
echo (new Travel(‘car‘))->travelMove() . PHP_EOL;//开车去上班
echo (new Travel(‘train‘))->travelMove() . ‘<br>‘;//开火车去上班
echo (new Travel(‘plane‘))->travelMove();//开飞机去上班

上面代码还可以优化,去掉依赖工厂类,接下来就使用到抽象工厂类--接口

<?php
 namespcae Demo2;
// 接口
class iVehicle{
    public function drive();
}
 //Car.php
 // 汽车类
 class Car implement iVehicle
 {
   public function drive(){
         return ‘开车‘;
     }    
 }
 //脚本2 Plane.php
 // 飞机类
 class Plane implement iVehicle
 {
   public function drive(){
         return ‘开飞机‘;
     }  
 }
 //脚本3 Train.php
 class Train implement iVehicle
 {
     public function drive(){
         return ‘开火车‘;
     }
 }
 //脚本4 Travel.php
 <?php
 namespace Demo2;
user ...;
 //在一个文件A中调用另一个文件B的类需要加载B文件,这里使用自动加载
 require __DIR__ . ‘autoload.php‘;

 // 旅行
 class Travel
{
     private $vehicle;
    // 将原构造方法中实例化依赖对象的过程,交给工厂类完成了
     public function __construct(iVehicle $vehicle=null){
        // 将原来依赖一个工厂类,变成面向接口的抽象工厂模式
        $this->vehicle = $vehicle;
    }
    // 调用外部依赖的对象的方法
     public function travelMove(iVehicle $vehicle){
         return $vehicle->drive().‘去上班‘;
     }
}
// 调用
echo (new Travel())->travelMove(new Car()) . PHP_EOL;//开车去上班
echo (new Travel())->travelMove(new Train()) . ‘<br>‘;//开火车去上班
echo (new Travel())->travelMove(new Plane());//开飞机去上班

 

PHP设计模式之工厂模式(2)

上一篇:HTML DOM 事件


下一篇:.net5 necore 根据环境修改指定Urls 指定启动的ip和端口