PHP开发

php设计模式之工厂模式

2020-03-29  本文已影响0人  潇湘夜雨_pwj

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,则不能被继承

上一篇 下一篇

猜你喜欢

热点阅读