PHP面试常考之设计模式——工厂模式

你好,是我琉忆,PHP程序员面试笔试系列图书的做者。php

本周(2019.3.11至3.15)的一三五更新的文章以下:程序员

周一:PHP面试常考之设计模式——工厂模式
周三:PHP面试常考之设计模式——建造者模式
周五:PHP面试常考之设计模式——策略模式

今天这篇文章主要讲解的是PHP面试常考的设计模式之工厂模式。工厂模式其实能够划分为:简单工厂模式、工厂方法模式、抽象工厂模式等。具体它们有什么区别,用途有哪些呢?如下我将进行讲解。面试

本身整理了一篇“ 设计模式须要遵照的5大原则”的文章,关注公众号:“ 琉忆编程库”,回复:“ 原则”,我发给你。

如下内容如需转载,请注明做者和出处。

一、简单工厂模式

介绍:
简单工厂模式又称为静态工厂方法(Static Factory Method)模式,它属于类建立型模式。在简单工厂模式中,能够根据参数的不一样返回不一样类的实例。简单工厂模式专门定义一个类来负责建立其余类的实例,被建立的实例一般都具备共同的父类。编程

UML图:设计模式

clipboard.png

说明:spa

  • CashFactory类:负责建立具体产品的实例
  • CashSuper类:抽象产品类,定义产品子类的公共接口
  • CreateCashAccept 类:具体产品类,实现Product父类的接口功能,也可添加自定义的功能

简单工厂模式最大的优势在于实现对象的建立和对象的使用分离,将对象的建立交给专门的工厂类负责,可是其最大的缺点在于工厂类不够灵活,增长新的具体产品须要修改工厂类的判断逻辑代码,并且产品较多时,工厂方法代码将会很是复杂。设计

实现示例:code

<?php 
//简单工厂模式
class Cat
{
  function __construct()
  {
      echo "I am Cat class <br>";
  }
}
class Dog
{
  function __construct()
  {
      echo "I am Dog class <br>";
  }
}
class Factory
{
  public static function CreateAnimal($name){
      if ($name == 'cat') {
          return new Cat();
      } elseif ($name == 'dog') {
          return new Dog();
      }
  }
}

$cat = Factory::CreateAnimal('cat');
$dog = Factory::CreateAnimal('dog');

二、工厂方法模式

介绍:
工厂方法模式经过定义一个抽象的核心工厂类,并定义建立产品对象的接口,建立具体产品实例的工做延迟到其工厂子类去完成。这样作的好处是核心类只关注工厂类的接口定义,而具体的产品实例交给具体的工厂子类去建立。当系统须要新增一个产品是,无需修改现有系统代码,只须要添加一个具体产品类和其对应的工厂子类,是系统的扩展性变得很好,符合面向对象编程的开闭原则;对象

UML图:blog

clipboard.png

说明:

  • Product:抽象产品类
  • ConcreteProduct:具体产品类
  • Factory:抽象工厂类
  • ConcreteFactory:具体工厂类

工厂方法模式是简单工厂模式的进一步抽象和推广。因为使用了面向对象的多态性,工厂方法模式保持了简单工厂模式的优势,并且克服了它的缺点。在工厂方法模式中,核心的工厂类再也不负责全部产品的建立,而是将具体建立工做交给子类去作。这个核心类仅仅负责给出具体工厂必须实现的接口,而不负责产品类被实例化这种细节,这使得工厂方法模式能够容许系统在不修改工厂角色的状况下引进新产品。

实现示例:

<?php 
interface Animal{
  public function run();
  public function say();
}
class Cat implements Animal
{
  public function run(){
      echo "I ran slowly <br>";
  }
  public function say(){
      echo "I am Cat class <br>";
  }
}
class Dog implements Animal
{
  public function run(){
      echo "I'm running fast <br>";
  }
  public function say(){
      echo "I am Dog class <br>";
  }
}
abstract class Factory{
  abstract static function createAnimal();
}
class CatFactory extends Factory
{
  public static function createAnimal()
  {
      return new Cat();
  }
}
class DogFactory extends Factory
{
  public static function createAnimal()
  {
      return new Dog();
  }
}

$cat = CatFactory::createAnimal();
$cat->say();
$cat->run();

$dog = DogFactory::createAnimal();
$dog->say();
$dog->run();

本身整理了一篇“ 设计模式须要遵照的5大原则”的文章,关注公众号:“ 琉忆编程库”,回复:“ 原则”,我发给你。

三、抽象工厂模式

介绍:
抽象工厂模式提供一个建立一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象建立型模式。

此模式是对工厂方法模式的进一步扩展。在工厂方法模式中,一个具体的工厂负责生产一类具体的产品,即一对一的关系,可是,若是须要一个具体的工厂生产多种产品对象,那么就须要用到抽象工厂模式了。

为了便于理解此模式,这里介绍两个概念:

产品等级结构:产品等级结构即产品的继承结构,如一个抽象类是电视机,其子类有海尔电视机、海信电视机、TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体品牌的电视机是其子类。

产品族 :在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不一样产品等级结构中的一组产品,如海尔电器工厂生产的海尔电视机、海尔电冰箱,海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中。

UML类图:

clipboard.png

说明:
具体类图的功能能够看UML图的说明

实现示例:

<?php 

interface TV{
  public function open();
  public function use();
}

class HaierTv implements TV
{
  public function open()
  {
      echo "Open Haier TV <br>";
  }

  public function use()
  {
      echo "I'm watching TV <br>";
  }
}

interface PC{
  public function work();
  public function play();
}

class LenovoPc implements PC
{
  public function work()
  {
      echo "I'm working on a Lenovo computer <br>";
  }
  public function play()
  {
      echo "Lenovo computers can be used to play games <br>";
  }
}

abstract class Factory{
  abstract public static function createPc();
  abstract public static function createTv();
}

class ProductFactory extends Factory
{
  public static function createTV()
  {
      return new HaierTv();
  }
  public static function createPc()
  {
      return new LenovoPc();
  }
}

$newTv = ProductFactory::createTV();
$newTv->open();
$newTv->use();

$newPc = ProductFactory::createPc();
$newPc->work();
$newPc->play();

本身编写的《PHP程序员面试笔试宝典》《PHP程序员面试笔试真题解析》书籍,已在各大电商平台销售,两本能够帮助你更快更好的拿到offer的书
图片描述
更多PHP相关的面试知识、考题能够关注公众号获取:琉忆编程库

clipboard.png

对本文有什么问题或建议均可以进行留言,我将不断完善追求极致,感谢大家的支持。

相关文章
相关标签/搜索