网络编程
位置:首页>> 网络编程>> php编程>> PHP抽象工厂模式Abstract Factory Pattern优点与实现方式

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

作者:php_gl12345678  发布时间:2023-05-25 03:04:57 

标签:PHP,抽象工厂,Abstract,Factory,Pattern

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

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

抽象工厂模式的优点

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

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

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

抽象工厂模式的实现

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

1. 定义抽象产品类

<?php
// 定义抽象产品类(汽车)
abstract class Car
{
   protected $brand;
   protected $type;
   public function __construct($brand, $type)
   {
       $this->brand = $brand;
       $this->type = $type;
   }
   abstract public function run();
}
// 定义抽象产品类(手机)
abstract class Phone
{
   protected $brand;
   protected $model;
   public function __construct($brand, $model)
   {
       $this->brand = $brand;
       $this->model = $model;
   }
   abstract public function call();
}

2. 定义具体产品类

<?php
// 定义具体产品类(奔驰汽车)
class BenzCar extends Car
{
   public function run()
   {
       echo "{$this->brand} {$this->type} is running..." . PHP_EOL;
   }
}
// 定义具体产品类(宝马汽车)
class BmwCar extends Car
{
   public function run()
   {
       echo "{$this->brand} {$this->type} is running..." . PHP_EOL;
   }
}
// 定义具体产品类(苹果手机)
class ApplePhone extends Phone
{
   public function call()
   {
       echo "{$this->brand} {$this->model} is calling..." . PHP_EOL;
   }
}
// 定义具体产品类(华为手机)
class HuaweiPhone extends Phone
{
   public function call()
   {
       echo "{$this->brand} {$this->model} is calling..." . PHP_EOL;
   }
}

3. 定义抽象工厂类

<?php
// 定义抽象工厂类
abstract class AbstractFactory
{
   abstract public function createCar($type);
   abstract public function createPhone($model);
}

4. 定义具体工厂类

<?php
// 定义具体工厂类(德国工厂)
class GermanFactory extends AbstractFactory
{
   public function createCar($type)
   {
       switch ($type) {
           case 'Benz':
               return new BenzCar('Benz', 'C200L');
           case 'Bmw':
               return new BmwCar('Bmw', 'X3');
           default:
               throw new Exception('Undefined car type.');
       }
   }
   public function createPhone($model)
   {
       switch ($model) {
           case 'iPhone':
               return new ApplePhone('Apple', 'iPhone 11');
           case 'Huawei':
               return new HuaweiPhone('Huawei', 'Mate 30');
           default:
               throw new Exception('Undefined phone model.');
       }
   }
}
// 定义具体工厂类(中国工厂)
class ChineseFactory extends AbstractFactory
{
   public function createCar($type)
   {
       switch ($type) {
           case 'Benz':
               return new BenzCar('奔驰', 'C200L');
           case 'Bmw':
               return new BmwCar('宝马', 'X3');
           default:
               throw new Exception('Undefined car type.');
       }
   }
   public function createPhone($model)
   {
       switch ($model) {
           case 'iPhone':
               return new ApplePhone('苹果', 'iPhone 11');
           case 'Huawei':
               return new HuaweiPhone('华为', 'Mate 30');
           default:
               throw new Exception('Undefined phone model.');
       }
   }
}

5. 使用

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

总结

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

来源:https://blog.csdn.net/weixin_39934453/article/details/129717283

0
投稿

猜你喜欢

  • <% class menusPublic Title, ID, Image, TitleColor, Target, Backgrou
  • 以下是服务端代码var HTTPREQUEST_PROXYSETTING_DEFAULT = 0;var&nb
  • 事实上各式Tooltips方法非常多. 不过大部分都是用Javascript实现.例如ikshow.cn, 使用的JavaScript, D
  • 本文列出了初学网页编程中常用到的一些代码和一些技巧,简单实用,您一定用得到。1、oncontextmenu="window.eve
  • 在对浏览器兼容性要求越来越高的时候,大家是否正在寻找一个完整的解决方案呢?继《[原]最新CSS兼容方案》之后,更新的CSS hack出炉啦,
  • 密码保护是注册过程中的关键环节,尤其是对帐户安全级别比较高的网站,尤其在账号被盗或者涉及安全登录等问题的情况下,密码保护问题作为用户身份识别
  • 利用 CSS 来实现对象的垂直居中有许多不同的方法,比较难的是选择那个正确的方法。我下面说明一下我看到的好的方法和怎么来创建一个好的居中网站
  • 在设计网页时,经常遇到某些页面需限权访问的情况。比如,一个公司的某些产品只让某一或某些供应商或客户浏览。那么,我们如何实现这一功能呢?本文,
  • MySQL是一个非常流行的小型关系型数据库管理系统,2008年1月16号被Sun公司收购。目前MySQL被广泛地应用在Internet上的中
  • oracle命令删除用户:connect / as sysdba; shutdown abort; startup;&n
  • 在MySQL服务器启动时,它检查其命令行的操作,来查看它是否应该执行登录并打开相应的日志文件(如果应该的话)。可以让服务器生成两种主要类型的
  • 作为设计师,我们都知道,一个极简的设计可以实现漂亮的效果。然而,很多设计师在实现上有些麻烦:要么是没有时间让使用如此少的元素制作的页面看起来
  • 近日,朋友写一个关于成绩管理的系统,其中遇到一个小问题。如果按照SQLSERVER的ORDER 排序时,比如遇到两个100分,结果必然是名次
  • 个人网站如有会员注册模块+动网论坛的话,那网站要与动网论坛系统整合,实现不同Web系统之间的用户信息同步更新、登录等操作就不是件容易的事了,
  • 其实在很久很久之前就发现search类型的input,该属性值是WebKit私有,不过一直没去查相关的属性,介于XXX原因,我找出其属性,回
  • 下面的这个函数实现的功能是列出某文件夹下的所有文件,以文件名字母排序,先数字后字母再到中文。<%   
  • 惊现!表面下的隐藏信息——浅谈信息可视化1910年,病卧床上的魏格那(德国气象学家,以“大陆漂移学说”闻名),无意地注视着墙上的世界地图……
  • object.OpenTextFile(filename[, iomode[, create[, format]]]) 参数 object
  • /* 小弟刚刚接触ORACLE存储过程,有一个问题向各位同行求教,小弟写了一个存储过程,其目的是接收一个参数作为表名,然后查询该表中的全部记
  • 上次介绍了Access 导入 MSSQL 2000/2005 数据库工具,不过,在使用这个工具时还是有一些地方需要注意的,我把整个导入过程记
手机版 网络编程 asp之家 www.aspxhome.com