当前位置:首页 > PHP教程 > php高级应用 > 列表

PHP抽象工厂模式Abstract Factory Pattern优点与实现方式

发布:smiling 来源: PHP粉丝网  添加日期:2023-07-03 19:23:05 浏览: 评论:0 

这篇文章主要介绍了PHP抽象工厂模式Abstract Factory Pattern优点与实现方式,抽象工厂模式是一种创建型模式,它提供了一种创建一系列相关或相互依赖对象的最佳方式。

抽象工厂模式Abstract Factory Pattern是什么

抽象工厂模式是一种创建型模式,它提供了一种创建一系列相关或相互依赖对象的最佳方式。在抽象工厂模式中,我们定义一个抽象工厂接口,由具体的工厂类来实现该接口,创建一系列相关的对象。

抽象工厂模式的优点

抽象工厂模式可以帮助我们实现松耦合,客户端代码无需知道实际创建的对象,只需知道抽象工厂即可;

抽象工厂模式可以帮助我们封装变化,客户端代码无需关心具体对象的创建过程,只需关心抽象工厂即可;

抽象工厂模式可以帮助我们实现单一职责原则,一个类只负责一个职责,由工厂类负责创建对象。

抽象工厂模式的实现

在 PHP 中,我们可以使用以下方式来实现抽象工厂模式:

1. 定义抽象产品类

  1. <?php 
  2. // 定义抽象产品类(汽车) 
  3. abstract class Car 
  4.     protected $brand
  5.     protected $type
  6.     public function __construct($brand$type
  7.     { 
  8.         $this->brand = $brand
  9.         $this->type = $type
  10.     } 
  11.     abstract public function run(); 
  12. // 定义抽象产品类(手机) 
  13. abstract class Phone 
  14.     protected $brand
  15.     protected $model
  16.     public function __construct($brand$model
  17.     { 
  18.         $this->brand = $brand
  19.         $this->model = $model
  20.     } 
  21.     abstract public function call(); 

2. 定义具体产品类

  1. <?php 
  2. // 定义具体产品类(奔驰汽车) 
  3. class BenzCar extends Car 
  4.     public function run() 
  5.     { 
  6.         echo "{$this->brand} {$this->type} is running..." . PHP_EOL; 
  7.     } 
  8. // 定义具体产品类(宝马汽车) 
  9. class BmwCar extends Car 
  10.     public function run() 
  11.     { 
  12.         echo "{$this->brand} {$this->type} is running..." . PHP_EOL; 
  13.     } 
  14. // 定义具体产品类(苹果手机) 
  15. class ApplePhone extends Phone 
  16.     public function call() 
  17.     { 
  18.         echo "{$this->brand} {$this->model} is calling..." . PHP_EOL; 
  19.     } 
  20. // 定义具体产品类(华为手机) 
  21. class HuaweiPhone extends Phone 
  22.     public function call() 
  23.     { 
  24.         echo "{$this->brand} {$this->model} is calling..." . PHP_EOL; 
  25.     } 

3. 定义抽象工厂类

  1. <?php 
  2. // 定义抽象工厂类 
  3. abstract class AbstractFactory 
  4.     abstract public function createCar($type); 
  5.     abstract public function createPhone($model); 

4. 定义具体工厂类

  1. <?php 
  2. // 定义具体工厂类(德国工厂) 
  3. class GermanFactory extends AbstractFactory 
  4.     public function createCar($type
  5.     { 
  6.         switch ($type) { 
  7.             case 'Benz'
  8.                 return new BenzCar('Benz''C200L'); 
  9.             case 'Bmw'
  10.                 return new BmwCar('Bmw''X3'); 
  11.             default
  12.                 throw new Exception('Undefined car type.'); 
  13.         } 
  14.     } 
  15.     public function createPhone($model
  16.     { 
  17.         switch ($model) { 
  18.             case 'iPhone'
  19.                 return new ApplePhone('Apple''iPhone 11'); 
  20.             case 'Huawei'
  21.                 return new HuaweiPhone('Huawei''Mate 30'); 
  22.             default
  23.                 throw new Exception('Undefined phone model.'); 
  24.         } 
  25.     } 
  26. // 定义具体工厂类(中国工厂) 
  27. class ChineseFactory extends AbstractFactory 
  28.     public function createCar($type
  29.     { 
  30.         switch ($type) { 
  31.             case 'Benz'
  32.                 return new BenzCar('奔驰''C200L'); 
  33.             case 'Bmw'
  34.                 return new BmwCar('宝马''X3'); 
  35.             default
  36.                 throw new Exception('Undefined car type.'); 
  37.         } 
  38.     } 
  39.     public function createPhone($model
  40.     { 
  41.         switch ($model) { 
  42.             case 'iPhone'
  43.                 return new ApplePhone('苹果''iPhone 11'); 
  44.             case 'Huawei'
  45.                 return new HuaweiPhone('华为''Mate 30'); 
  46.             default
  47.                 throw new Exception('Undefined phone model.'); 
  48.         } 
  49.     } 

5. 使用

  1. <?php 
  2. // 使用德国工厂 
  3. $germanFactory = new GermanFactory(); 
  4. $car1 = $germanFactory->createCar('Benz'); 
  5. $car1->run(); // output: Benz C200L is running... 
  6. $phone1 = $germanFactory->createPhone('iPhone'); 
  7. $phone1->call(); // output: Apple iPhone 11 is calling... 
  8. // 使用中国工厂 
  9. $chineseFactory = new ChineseFactory(); 
  10. $car2 = $chineseFactory->createCar('Bmw'); 
  11. $car2->run(); // output: 宝马 X3 is running... 
  12. $phone2 = $chineseFactory->createPhone('Huawei'); 
  13. $phone2->call(); // output: 华为 Mate 30 is calling... 

总结:

抽象工厂模式是一种非常常见的创建型模式,它可以帮助我们封装变化,实现松耦合,同时遵循单一职责原则。在实际开发中,我们可以根据具体的需求,选择不同的抽象工厂模式来实现一系列相关对象的创建。

Tags: PHP抽象工厂模式 Abstract Factory Pattern

分享到: