PHP工厂模式和抽象工厂模式

PHP工厂模式和抽象工厂模式PHP工厂模式:php设计模式笔记,第二个是工厂模式。工厂,我们就可以联想到是一座房子,里面有N多车间,生产着不同系列的产品。我们如果是采购的话,要看什么产品,工厂很快从随便从其中一个车间拿出一个就解决,不会影响其他车间的工作,各自分工明确。在复杂的情况,也简单化了。php里面的工厂模式,也类似,由一个类,看作是工厂,在类里面构造一个对外方法接口,返回不同类型的类实例。工厂模式的好处:在复

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

PHP工厂模式:

php设计模式笔记,第二个是工厂模式。工厂,我们就可以联想到是一座房子,里面有N多车间,生产着不同系列的产品。我们如果是采购的话,要看什么产品,工厂很快从随便从其中一个车间拿出一个就解决,不会影响其他车间的工作,各自分工明确。在复杂的情况,也简单化了。php里面的工厂模式,也类似,由一个类,看作是工厂,在类里面构造一个对外方法接口,返回不同类型的类实例。

工厂模式的好处:在复杂情况中,可以非常方便扩展类。例如数据库工厂,就是用了这种模式,可以不影响其他数据库访问类型的前提下,扩展其他数据库操作api类。

代码演示,有日志输出,方便你理解工厂模式的机制:
/**
 * PHP设计模式 之 工厂模式
 */
interface IEat{
    public function showFoot();
}
 
class Morning implements IEat{
    public function showFoot(){
        echo '早餐菜单: 豆浆+油条+面包';
    }
}
 
class Noon implements IEat{
    public function showFoot(){
        echo '午餐菜单: 蒸饭+烧鸭+可乐';
    }
}
 
class Night implements IEat{
    public function showFoot(){
        echo '晚餐菜单: 披萨套餐';
    }
}
 
class Bedtime implements IEat{
    public function showFoot(){
        echo '夜宵菜单: 绿豆汤';
    }
}
 
class Noeat implements IEat{
    public function showFoot(){
        echo '不着调时间,没有东西吃';
    }
}
 
class EatFactory {
    public static function factory($hh=''){
        $h= ($hh) ? $hh:date('H');
        if($h>6 && $h<9){$c= 'Morning';}
        else if($h>=11 && $h<14){$c='Noon';}
        else if ($h>=17 && $h < 21){$c='Night';}
        else if ($h>=22 && $h< 24) {$c='Bedtime';}
        else {$c='Noeat';}
        return new $c();
    }
}

///demo code 
$eat01 = EatFactory::factory();
$eat01->showFoot();
$eat02 = EatFactory::factory(7);
$eat02->showFoot();
$eat03 = EatFactory::factory(12);
$eat03->showFoot();
$eat04 = EatFactory::factory(22);
$eat04->showFoot();
var_dump($eat01);
var_dump($eat02);
var_dump($eat03);
var_dump($eat04);
 
//输出日志
午餐菜单: 蒸饭+烧鸭+可乐
早餐菜单: 豆浆+油条+面包
午餐菜单: 蒸饭+烧鸭+可乐
夜宵菜单: 绿豆汤
 
object(Noon)#1 (0) { } 
object(Morning)#2 (0) { } 
object(Noon)#3 (0) { } 
object(Bedtime)#4 (0) { } 

PHP抽象工厂模式:

php设计模式笔记,第三个是抽象工厂模式。工厂模式为什么又有抽象工厂模式,它们直接有什么区别?上次提及的工厂模式简单的可以看成只有一个工厂,生产各种不同的产品类。而抽象工厂模式是,可以看出是多个工厂的集合。

而抽象工厂模式设计的名词:产品族、产品等级。初步接触理解起来比较容易混淆,如果通俗的理解是,一个工厂可以看成是一个产品族,而产品族可以由多个产品等级(既产品系列)组成,而一个产品等级可以有具体的产品。

测试数据,苹果:手机iphone5,平板电脑ipad 4;三星:手机I9300,平板电脑GALAXY Note 10.1。

结合抽象工厂模式的名词对照关系如下:

产品族:苹果,三星

产品等级:手机,平板电脑

具体产品:iphone 5、ipad4 ,I9300、GALAXY Note 10.1

php如何实现这种模式:首先要用一个接口类来罗列有多少个抽象产品实现的方法;然后有多少个产品族就有多少个工厂类,分别继承接口类,实现接口类,负责创建产品类的实例化。最后我们实现产品类,同类产品族的具体产品类都会有实现一个公共的产品接口接口类。

代码演示,实现抽象工厂模式:

/**
 * PHP设计模式 之 抽象工厂模式
 *
 */
interface IAbsFactory {
    public function showLastNewMobile();
    public function showLastNewComputer();
}
 
class AppleFactory implements IAbsFactory {
     
    public function showLastNewMobile(){
        return new AppleLastNewMobile();
    }
     
    public function showLastNewComputer(){
        return new AppleLastNewComputer();
    }
}
 
interface IAppleProduct {
    public function getSystemVersion();
    public function getName();
    public function getPrice();
}
 
class AppleLastNewMobile implements IAppleProduct {
     
    public function getSystemVersion(){
        echo  'iOS 6.0';
    }
     
    public function getName(){
        echo 'iphone 5';
    }
     
    public function getPrice() {
        echo '5288 RMB';
    }
     
}
 
class AppleLastNewComputer implements IAppleProduct {
     
    public function getSystemVersion(){
        echo  'iOS 6';
    }
     
    public function getName(){
        echo 'ipad 4';
    }
     
    public function getPrice() {
        echo '3688 RMB';
    }
}
 
class SamsungFactory implements IAbsFactory {
    public function showLastNewMobile() {
        return new SamsungLastNewMobile();
    }
     
    public function showLastNewComputer(){
        return new SamsungLastNewComputer();
    }
}
 
interface ISamsungProduct {
    public function getSystemVersion();
    public function getName();
    public function getPrice();
}
 
class SamsungLastNewMobile implements ISamsungProduct {
    public function getSystemVersion(){
        echo 'Android 4.0'; 
    }
    public function getName(){
        echo 'I9300';
    }
    public function getPrice(){
        echo '4,699 RMB';
    }
}
 
class SamsungLastNewComputer  implements ISamsungProduct {
    public function getSystemVersion(){
        echo 'Android 4.0';
    }
    public function getName(){
        echo 'GALAXY Note 10.1';
    }
    public function getPrice(){
        echo '3,800 RMB';
    }
}

/**
 * 产品族 - 苹果
 */
$apple = new AppleFactory();
 
//打印最新手机产品
$iphone = $apple->showLastNewMobile();
$iphone->getName();
$iphone->getPrice();
$iphone->getSystemVersion();
 
//打印最新平板电脑
$ipad = $apple->showLastNewComputer();
$ipad->getName();
$ipad->getPrice();
$ipad->getSystemVersion();
 
 
/**
 * 产品族 - 三星
 */
$samsung = new SamsungFactory();
 
//打印最新手机产品
$samsungMob = $samsung->showLastNewMobile();
$samsungMob->getName();
$samsungMob->getPrice();
$samsungMob->getSystemVersion();
 
 
//打印最新平板电脑
$samsungIpad = $samsung->showLastNewComputer();
$samsungIpad->getName();
$samsungIpad->getPrice();
$samsungIpad->getSystemVersion();
 
//输入结果
iphone 5
5288 RMB
iOS 6.0
 
ipad 4
3688 RMB
iOS 6
 
 
-------------------------------------
 
I9300
4,699 RMB
Android 4.0
 
GALAXY Note 10.1
3,800 RMB
Android 4.0
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/164370.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 使用systemctl命令启动和关闭mysql

    使用systemctl命令启动和关闭mysql以前都用service命令管理mysql,现在liunx系统升级了,又有了新的更好的方法管理系统进程,现在我们来学习如何用systemctl命令管理mysql。Systemctl是一个systemd工具,主要负责控制systemd系统和服务管理器。Systemd是一个系统管理守护进程、工具和库的集合,用于取代SystemV初始进程。Systemd的功能是用于集中管理和配置类UNIX系统。在

    2025年7月3日
    2
  • fork join框架原理_jalor6框架教程

    fork join框架原理_jalor6框架教程声明:本篇博客是在阅读了引用博客的两篇文章后做了简短的概括与归纳,只作为自己笔记文章目录一、思想二、工作窃取算法三、demo用例四、关键组件ForkJoinPoolForkJoinTaskForkJoinWorkerThreadWorkQueue五、Fork/Join运行流程图任务提交创建线程signalWork方法任务执行六、引用博客一、思想Fork/Join是Java7提供的并行执行…

    2022年9月20日
    2
  • 阿里云轻量应用型服务器防火墙端口开放了还是无法访问问题@林[通俗易懂]

    阿里云轻量应用型服务器防火墙端口开放了还是无法访问问题@林[通俗易懂]阿里云轻量应用型服务器防火墙端口开放了还是无法访问问题登录阿里云找到防火墙远程连接服务器,开启防火墙对应端口这里我用的是FinalShell,当然这个远程连接的软件可以不同,只要能远程连接上服务器就行;(1)查看防火墙状态(dead状态,防火墙未开启;active状态,即防火墙开启)systemctlstatusfirewalld(2)防火墙未开启,开启防火墙(防火墙开启后记得再查看防火墙状态)systemctlstartfirewalld(3)查看开放端口列表f

    2022年9月27日
    2
  • Centos7安装mysql8.0教程

    Centos7安装mysql8.0教程准备工作1.查看是否有安装过mysqlrpm-qa|grep-imysql2.删除mysqlyum-yremoveMySQL-*一般用rpm-e的命令删除mysql,这样表面上删除了mysql,可是mysql的一些残余程序仍然存在,并且通过第一步的方式也查找不到残余,而yum命令比较强大,可以完全删除mysql.(ps:用rpm删除后再次安装的时候会提示已经安装…

    2022年6月5日
    41
  • 人脸识别系统如何建模_3dmax人脸建模

    人脸识别系统如何建模_3dmax人脸建模本发明涉及生物特征识别,特别是涉及人脸识别中的特征建模方法。背景技术:人脸识别技术一般包括四个组成部分,分别为人脸图像采集、人脸图像预处理、人脸图像特征提取以及匹配与识别,具体来说:人脸图像采集及检测是指通过摄像镜头等视频图像采集装置采集包括有人脸的视频或图像数据,可以是采集对象的静态图像、动态图像、不同的位置、不同表情等。人脸图像预处理是指从采集的图像数据中确定人脸的部分,并进行灰度校正、噪声过…

    2022年9月17日
    2
  • BitBlt介绍

    BitBlt介绍

    2021年12月10日
    59

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号