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


猜你喜欢
- 需求需要生成一个宣传的图片分享到朋友圈,这个宣传图片包含二维码,包含不同的背景图片和不同的文字。对于这种图片生成,我们考虑过使用服务端生成,
- 具体代码如下所示:import osfrom PIL import ImageUNIT_SIZE = 220 # the size of i
- Ubuntu Server下启动/停止/重启MySQL数据库的三种方式系统环境:ubuntu server 12.10 x64(mysql为
- 本文实例讲述了php+js实现的无刷新下载文件功能。分享给大家供大家参考,具体如下:服务器端页面步骤就是,设置头文件参数,然后读入并输出文件
- 发现问题python嵌套列表大家应该都不陌生,但最近遇到了一个问题,这是工作中遇到的一个坑,首先看一下问题raw_list = [[&quo
- Python的3.0版本,常被称为Python 3000,或简称Py3k。相对于Python的早期版本,这是一个较大的升级。为了不带入过多的
- Django 简介Django是一个开放源代码的Web应用框架,由Python写成。采用了MTV的框架模式,即模型M,视图V和模版T。它最初
- eval是Python的一个内置函数,这个函数的作用是,返回传入字符串的表达式的结果。想象一下变量赋值时,将等号右边的表达式写成字符串的格式
- importlib 模块的作用模块,是一个一个单独的py文件 包,里面包含多个模块(py文件)动态导入模块,这样就不用写那么多的import
- 最简单的:<textarea name="A" cols="45" rows="2&
- ASP调用WEBSERVICE----INDEX----1. soap请求方式2. post请求方式3.&
- 样式表是一种为超文本标签语言提供增强补充服务的技术,可对每一个html的标签做精雕细刻的修饰。只用html制作的网页,对页面内各部分的修饰能
- pprint的英文全称Data pretty printer,顾名思义就是让显示结果更漂亮。print()和pprint()都是python
- 今天大概弄懂了partition by和group by的区别联系。1. group by是分组函数,partition by是分析函数(然
- 备忘一下python中的字典如何遍历,没有什么太多技术含量.仅供作为初学者的我参考.#!/usr/bin/env python# codin
- 简述和GNU一样,YAML是一个递归着说“不”的名字。不同的是,GNU对UNIX说不,YAML说不的对象是XML。YAML不是XML。为什么
- 一旦被黑客获取到webshell,黑客就知道了你的sqlserver管理员密码,如果sqlserver再没有经过安全设置那么黑客很容易就提权
- 创建类Python 类使用 class 关键字来创建。简单的类的声明可以是关键字后紧跟类名:class ClassName(bases):&
- nodejieba 简介随着汉语言的广泛应用,中文信息处理成了一个重要的研究课题,常见于搜索引擎:信息检索、中外文自动翻译、数据挖掘技术、自
- forEaches5出来的方法,这是我在react中用的最多的遍历方法之一,用法如下:models.forEach(model =>