当前位置:首页 > 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. { 
  5.     protected $brand; 
  6.     protected $type; 
  7.     public function __construct($brand, $type) 
  8.     { 
  9.         $this->brand = $brand; 
  10.         $this->type = $type; 
  11.     } 
  12.     abstract public function run(); 
  13. } 
  14. // 定义抽象产品类(手机) 
  15. abstract class Phone 
  16. { 
  17.     protected $brand; 
  18.     protected $model; 
  19.     public function __construct($brand, $model) 
  20.     { 
  21.         $this->brand = $brand; 
  22.         $this->model = $model; 
  23.     } 
  24.     abstract public function call(); 
  25. } 

2. 定义具体产品类

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

3. 定义抽象工厂类

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

4. 定义具体工厂类

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

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

分享到: