美文网首页PHP开发
php设计模式之工厂模式

php设计模式之工厂模式

作者: 潇湘夜雨_pwj | 来源:发表于2020-03-29 21:55 被阅读0次

1. 工厂模式分类

工厂模式具体可分为三类模式:简单工厂模式,工厂方法模式,抽象工厂模式;

2. 简单工厂模式

又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

优点: 实现对象的创建和对象的使用分离,将对象的创建交给专门的工厂类负责
缺点: 工厂类不够灵活,增加新的具体产品需要修改工厂类的判断逻辑代码,而且产品较多时,工厂方法代码将会非常复杂

2.1. 角色

  1. Factory类:负责创建具体产品的实例
  2. Product类:抽象产品类,定义产品子类的公共接口
  3. ConcreteProduct 类:具体产品类,实现Product父类的接口功能,也可添加自定义的功能

2.2. UML类图

工厂简单模式.png

php示例代码: Factory.class.php

  <?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');

3. 工厂方法模式

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

3.1. 角色

  1. Product:抽象产品类
  2. ConcreteProduct:具体产品类
  3. Factory:抽象工厂类
  4. ConcreteFactory:具体工厂类

3.2. UML类图

工厂方法模式.png

php示例代码 ConcreteFactory.class.php:

  <?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();

4. 抽象工厂模式

提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。
此模式是对工厂方法模式的进一步扩展。在工厂方法模式中,一个具体的工厂负责生产一类具体的产品,即一对一的关系,但是,如果需要一个具体的工厂生产多种产品对象,那么就需要用到抽象工厂模式了。

4.1. 角色

  1. 抽象工厂(AbstractFactory):担任这个角色的是抽象工厂模式的核心,是与应用系统的商业逻辑无关的。
  2. 具体工厂(Factory):这个角色直接在客户端的调用下创建产品的实例,这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统商业逻辑紧密相关的。
  3. 抽象产品(AbstractProduct):担任这个角色的类是抽象工厂模式所创建的对象的父类,或它们共同拥有的接口
  4. 具体产品(Product):抽象工厂模式所创建的任何产品对象都是一个具体的产品类的实例。

4.2. 抽象工厂模式UML类图

抽象工厂模式.png

php示例代码: AbstructFactory.class.php

<?php 

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

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

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

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

  public function watch()
  {
      echo "I'm watching Lenovo 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>";
  }
}

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

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

class HaierFactory extends Factory
{
    public static function createTv()
    {
        return new HaierTv();
    }

    public static function createPc()
    {
        return new HaierPc();
    }

}

class LenovoFactory extends Factory
{
    public static function createTv()
    {
        return new LenovoTv();
    }

    public static function createPc()
    {
        return new LenovoPc();
    }

}

$haierFactory = new HaierFactory();
$haierTv = $haierFactory->createTv();
$haierTv->open();
$haierTv->watch();

$haierPc = $haierFactory->createPc();
$haierPc->work();
$haierPc->play();

$lenovoFactory = new LenovoFactory();
$lenovoPc = $lenovoFactory->createPc();
$lenovoPc->work();
$lenovoPc->play();

$lenovoTv = $lenovoFactory->createTv();
$lenovoTv->open();
$lenovoTv->watch();

php关键字

abstract(抽象) :

  1. 用abstract修饰的类表示这个类是一个抽象类,用abstract修饰的方法表示这个方法是一个抽象方法。
  2. 抽象方法是只有方法声明,而没有方法的实现内容。
  3. 抽象类不能被实例化,通常是将抽象方法做为子类方法重写使用的,且要把继承的抽象类里的方法都实现。

interface (接口):

  1. 如果一个抽象类里的所有方法都是抽象方法,且没有声明变量,所有成员都是public权限,那么这种特殊的抽象类就叫 接口
  2. interface即PHP接口,并用关键字implements来实现接口中方法,且必须完全实现

implements(实施,实现) :
implements是实现多个接口,接口的方法一般为空,必须重写才能使用

extends(继承) :
extends是继承某个类,继承之后可以使用父类的方法,也可以重写父类的方法,如果类被声明为final,则不能被继承

相关文章

  • 《PHP设计模式大全》系列分享专栏

    php设计模式介绍之编程惯用法第1/3页 php设计模式介绍之值对象模式第1/5页 介绍php设计模式中的工厂模式...

  • php 工厂模式

    承接上篇php模式设计之 单例模式,(虽然好像关系不大)。今天讲述第二种基础的模式设计——工厂模式。 那么何为工厂...

  • iOS设计模式(三)之抽象工厂模式

    设计模式系列传送门 iOS设计模式(一)之简单工厂模式iOS设计模式(二)之工厂模式iOS设计模式(三)之抽象工厂...

  • iOS设计模式(一)之简单工厂模式

    设计模式系列传送门 iOS设计模式(一)之简单工厂模式iOS设计模式(二)之工厂模式iOS设计模式(三)之抽象工厂...

  • iOS设计模式(二)之工厂模式

    设计模式系列传送门 iOS设计模式(一)之简单工厂模式iOS设计模式(二)之工厂模式iOS设计模式(三)之抽象工厂...

  • iOS设计模式之美-适配器模式

    iOS设计模式之美-工厂模式iOS设计模式之美-抽象工厂模式iOS设计模式之美-生成器模式iOS设计模式之美-适配...

  • iOS设计模式之美-抽象工厂模式

    iOS设计模式之美-工厂模式iOS设计模式之美-抽象工厂模式iOS设计模式之美-生成器模式iOS设计模式之美-适配...

  • iOS设计模式之美-工厂模式

    iOS设计模式之美-工厂模式iOS设计模式之美-抽象工厂模式iOS设计模式之美-生成器模式iOS设计模式之美-适配...

  • iOS设计模式之美-生成器模式

    iOS设计模式之美-工厂模式iOS设计模式之美-抽象工厂模式iOS设计模式之美-生成器模式iOS设计模式之美-适配...

  • PHP-浅谈单例模式和工厂模式

    PHP中常用的设计模式有单例模式、工厂模式(简单工厂模式、工厂方法模式和抽象工厂方法模式)、适配模式、策略模式。 ...

网友评论

    本文标题:php设计模式之工厂模式

    本文链接:https://www.haomeiwen.com/subject/rrdpuhtx.html