php设计模式之工厂模式

1. 工厂模式分类

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

2. 简单工厂模式

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

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

2.1. 角色

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

2.2. UML类图

工厂简单模式.png

php示例代码: Factory.class.php

  ";
      }
  }
  class Dog
  {
      function __construct()
      {
          echo "I am Dog class 
"; } } 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:

  ";
      }
      public function say(){
          echo "I am Cat class 
"; } } class Dog implements Animal { public function run(){ echo "I'm running fast
"; } public function say(){ echo "I am Dog class
"; } } 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

";
  }

  public function watch()
  {
      echo "I'm watching Haier TV 
"; } } class LenovoTv implements TV { public function open() { echo "Open Lenovo TV
"; } public function watch() { echo "I'm watching Lenovo TV
"; } } interface PC{ public function work(); public function play(); } class LenovoPc implements PC { public function work() { echo "I'm working on a Lenovo computer
"; } public function play() { echo "Lenovo computers can be used to play games
"; } } class HaierPc implements PC { public function work() { echo "I'm working on a Haier computer
"; } public function play() { echo "Haier computers can be used to play games
"; } } 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设计模式之工厂模式)