PHP设计模式---工厂模式

工厂模式(Factor Pattern),就是负责生成其他对象的类或方法,也叫工厂方法模式

实现:定义一个用于创建对象的接口,让子类决定实例化哪一个类。
应用场景:众多子类并且会扩充、创建方法比较复杂。

为什么需要工厂模式

1,工厂模式可以将对象的生产从直接new 一个对象,改成通过调用一个工厂方法生产。这样的封装,代码若需修改new的对象时,不需修改多处new语句,只需更改生产对象方法。

2,若所需实例化的对象可选择来自不同的类,可省略if-else多层判断,给工厂方法传入对应的参数,利用多态性,实例化对应的类。

工厂模式分为三种:简单工厂工厂方法抽象工厂 ,三种工厂的区别是,抽象工厂由多条产品线,而工厂方法只有一条产品线,是抽象工厂的简化。而工厂方法和简单工厂相对,大家初看起来好像工厂方法增加了许多代码但是实现的功能和简单工厂一样。但本质是,简单工厂并未严格遵循设计模式的开闭原则,当需要增加新产品时也需要修改工厂代码。但是工厂方法则严格遵守开闭原则,模式只负责抽象工厂接口,具体工厂交给客户去扩展。在分工时,核心工程师负责抽象工厂和抽象产品的定义,业务工程师负责具体工厂和具体产品的实现。只要抽象层设计的好,框架就是非常稳定的。

<?php
/**
* 工厂模式
*
* @author webff
*/

//抽象产品
interface Person {
    public function getName(); 
}
//具体产品实现
class Teacher implements Person {
    public function getName() {
        return "老师n";
    }
}
class Student implements Person {
    public function getName() {
        return "学生n";
    }
}

//简单工厂
class SimpleFactory {
    public static function getPerson($type) {
      $person = null;
      if ($type == 'teacher') {
        $person = new Teacher();
      } elseif ($type == 'student') {
        $person = new Student();
      }
      return $person;
    }
}

//简单工厂调用
class SimpleClient {
    function main() {
      // 如果不用工厂模式,则需要提前指定具体类
      // $person = new Teacher();
      // echo $person->getName();
      // $person = new Student();
      // echo $person->getName();

      // 用工厂模式,则不需要知道对象由什么类产生,交给工厂去决定
      $person = SimpleFactory::getPerson('teacher');
      echo $person->getName();
      $person = SimpleFactory::getPerson('student');
      echo $person->getName();
    }
}


//工厂方法
interface CommFactory {
    public function getPerson();
}
    //具体工厂实现
class StudentFactory implements CommFactory {
    public function getPerson(){
        return new Student();
    }
}
class TeacherFactory implements CommFactory {
    public function getPerson() {
        return new Teacher();
    }
}

//工厂方法调用
class CommClient {
    public static function main() {
        $factory = new TeacherFactory();
        echo $factory->getPerson()->getName();
        $factory = new StudentFactory();
        echo $factory->getPerson()->getName();
    }
}



//抽象工厂模式另一条产品线
interface Grade {
    function getYear();
}
//另一条产品线的具体产品
class Grade1 implements Grade {
    public function getYear() {
        return '2016级';
    }
}
class Grade2 implements Grade {
    public function getYear() {
        return '2017级';
    }
}


//抽象工厂
interface AbstractFactory {
    function getPerson();
    function getGrade();
}
//具体工厂可以产生每个产品线的产品
class Grade1TeacherFactory implements AbstractFactory {
    public function getPerson() {
      return new Teacher();
    }
    public function getGrade() {
      return new Grade1();
    }
}
class Grade1StudentFactory implements AbstractFactory {
    public function getPerson() {
      return new Student();
    }
    public function getGrade() {
      return new Grade1();
    }
}
class Grade2TeacherFactory implements AbstractFactory {
    public function getPerson() {
      return new Teacher();
    }
    public function getGrade() {
      return new Grade2();
    }
}
//抽象工厂调用
class FactoryClient {
    public function printInfo($factory) {
      echo $factory->getGrade()->getYear().$factory->getPerson()->getName();
    }
    public static function main() {
      $client = new FactoryClient();
      $factory = new Grade1TeacherFactory();
      $client->printInfo($factory);
      $factory = new Grade1StudentFactory();
      $client->printInfo($factory);
      $factory = new Grade2TeacherFactory();
      $client->printInfo($factory);
    }
}


//简单工厂
//SimpleClient::main();
//工厂方法
//CommClient::main();
//抽象工厂
FactoryClient::main();
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。通常我们所说的工厂模式是指工厂方法模...
    zfylin阅读 5,114评论 0 7
  • 创建型模式 抽象工厂模式(abstract facroty) 3.1模式动机 在工厂方法模式中具体工厂负责生产具体...
    僚机KK阅读 4,077评论 0 2
  • 简单工厂模式虽然简单,但存在一个很严重的问题。当系统中需要引入新产品时,由于静态工厂方法通过所传入参数的不同来创建...
    justCode_阅读 4,951评论 1 9
  • 第五十八章 省委好友突然造访 程思远和往常一样,看完中央电视台晚间新闻,简单洗簌一下,准备上床休息了...
    風雲獨攬阅读 3,921评论 15 22
  • 这几天在成都学习刘轶带领的非暴力沟通,今晚下课后,我曾经在西安的朋友现在也定居在成都,他们夫妻俩就过来请我吃饭,吃...
    杨荷有爱倾听阅读 3,251评论 0 3

友情链接更多精彩内容