当前位置: 首页 > 后端技术 > PHP

PHP面试笔试设计模式——工厂模式

时间:2023-03-29 15:03:44 PHP

大家好,我是PHP程序员面试笔试系列的作者刘毅。本周(2019.3.11至3.15)更新135篇文章如下:周一:PHP面试设计模式-工厂模式周三:PHP面试设计模式-Builder模式周五:PHP面试中频繁测试的设计模式-strategypattern今天这篇文章主要讲解PHP面试测试的设计模式工厂模式。工厂模式其实可以分为:简单工厂模式、工厂方法模式、抽象工厂模式等,它们之间有什么区别,有什么用途呢?我将在下面解释。自己整理了一篇《设计模式五原则》,关注公众号:《六一编程库》,回复:《原则》,发给你。以下内容如需转载,请注明作者及出处。一、简单工厂模式简介:简单工厂模式又称为静态工厂方法(StaticFactoryMethod)模式,属于类创建模式。在简单工厂模式中,可以根据不同的参数返回不同类的实例。简单工厂模式专门定义一个类负责创建其他类的实例,创建的实例通常有一个共同的父类。UML图:说明:CashFactory类:负责创建具体的产品实例CashSuper类:抽象产品类,定义产品子类的公共接口CreateCashAccept类:具体产品类,实现Product父类的接口功能,添加自定义函数简单工厂模型最大的优点是实现了对象创建和对象使用的分离,把对象的创建交给一个专门的工厂类。但是它最大的缺点就是工厂类不够灵活。添加新的特定产品需要修改工厂类。判断逻辑代码,当产品较多时,工厂方法代码会很复杂。实现示例:";}}classDog{function__construct(){echo"IamDogclass
";}}classFactory{publicstaticfunctionCreateAnimal($name){if($name=='cat'){returnnewCat();}elseif($name=='dog'){returnnewDog();}}}$cat=Factory::CreateAnimal('cat');$dog=Factory::CreateAnimal('dog');2、工厂方法模式简介:工厂方法模式定义了一个抽象的核心工厂类,定义了Create产品对象的接口,而创建具体产品实例的工作则延迟到其工厂子类中去完成。这样做的好处是核心类只关注工厂类的接口定义,具体的产品实例交给具体的工厂子类去创建。当系统需要添加新的产品时,不需要修改现有的系统代码,只需要添加具体的产品类及其对应的工厂子类,这样系统的扩展性就变得很好,并且符合面向对象程序设计的开闭原则;UML图:描述:Product:抽象产品类ConcreteProduct:具体产品类Factory:抽象工厂类ConcreteFactory:具体工厂类工厂方法模式是对简单工厂模式的进一步抽象和提升。由于使用了面向对象的多态性,工厂方法模式保持了简单工厂模式的优点,克服了它的缺点。在工厂方法模式中,核心工厂类不再负责所有产品的创建,而是将具体的创建工作交给子类。这个核心类只负责给出具体工厂必须实现的接口,不负责产品类被实例化的细节,这使得工厂方法模式允许系统在不修改工厂角色的情况下引入新产品。实现示例:";}publicfunctionsay(){echo"我是猫类
";}}classDogimplementsAnimal{publicfunctionrun(){echo"I'mrunningfast
";}publicfunctionsay(){echo"我是狗类
";}}abstractclassFactory{abstractstaticfunctioncreateAnimal();}classCatFactoryextendsFactory{publicstaticfunctioncreateAnimal(){returnnewCat();}}classDogFactoryextendsFactory{publicstaticfunctioncreateAnimal(){returnnewDog();}}$cat=CatFactory::createAnimal();$cat->say();$cat->run();$dog=DogFactory::createAnimal();$dog->say();$dog->跑步();自己整理了一篇《设计模式五原则》,关注公众号:《六一程序库》,回复:《原则》,发给你。3.抽象工厂模式简介:抽象工厂模式提供了一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们的具体类。抽象工厂模式,又称Kit模式,属于对象创建模式。该模式是工厂方法模式的进一步扩展。在工厂方法模式中,特定的工厂负责生产特定类型的产品,即一对一的关系。但是,如果需要一个特定的工厂来生产多个产品对象,那么就需要使用抽象工厂模式。为了便于理解这个模型,这里引入两个概念:产品层次结构:产品层次结构是产品的继承结构,比如一个抽象类是电视机,它的子类有海尔电视机、海信电视机、而TCL电视,则抽象电视与具体品牌电视之间形成了一个产品层次结构,抽象电视是父类,具体品牌电视是其子类。产品族:在抽象工厂模型中,产品族是指同一工厂生产的、位于不同产品层次结构中的一组产品,如海尔电器厂生产的海尔电视、海尔冰箱等。海尔电视位于电视机产品层次结构中,海尔冰箱位于冰箱产品层次结构中。UML类图:说明:具体类图的功能可以看UML图的说明实例:";}publicfunctionuse(){echo"我在看电视
";}}interfacePC{publicfunctionwork();publicfunctionplay();}classLenovoPcimplementsPC{publicfunctionwork(){echo"我在联想电脑上工作
";}publicfunctionplay(){echo"联想电脑可以用来玩游戏
";}}abstractclassFactory{abstractpublicstaticfunctioncreatePc();abstractpublicstaticfunctioncreateTv();}classProductFactoryextendsFactory{publicstaticfunctioncreateTV(){returnnewHaierTv();}publicstaticfunctioncreatePc(){returnnewLenovoPc();}}$newTv=ProductFactory::createTV();$newTv->open();$newTv->use();$newPc=ProductFactory::createPc();$newPc->work();$newPc->play();自己写的《PHP程序员面试笔试宝典》和《PHP程序员面试笔试真题解析》在各大电商平台均有销售。这两本书可以帮助你更快更好地拿到offer。更多关于PHP的面试知识和考题,可以关注公众号获取:六一编程库本文有任何问题或建议可以留言。我会不断改进,追求极致,谢谢大家的支持。