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();
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值