资讯专栏INFORMATION COLUMN

优才公开课笔记:php设计模式 (二)之工厂模式

aisuhua / 2339人阅读

摘要:但本质是,简单工厂并未严格遵循设计模式的开闭原则,当需要增加新产品时也需要修改工厂代码。但是工厂方法则严格遵守开闭原则,模式只负责抽象工厂接口,具体工厂交给客户去扩展。

最近开展了三次设计模式的公开课,现在来总结一下设计模式在PHP中的应用,这是第二篇创建型模式之工厂模式。

设计模式的一般介绍在第一篇文章讲了,这里就不重复。

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

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

/**
 * 优才网公开课示例代码
 *
 * 工厂模式
 *
 * @author 优才网全栈工程师教研组
 * @see http://www.ucai.cn
 */

//抽象产品
interface Person {
    public function getName(); 
}
//具体产品实现
class Teacher implements Person {
    function getName() {
        return "老师n";
    }
}
class Student implements Person {
    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 {
    function getPerson(){
        return new Student();
    }
}
class TeacherFactory implements CommFactory {
    function getPerson() {
        return new Teacher();
    }
}

//工厂方法调用
class CommClient {
    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 "2003级";
       }
}
class Grade2 implements Grade {
       public function getYear() {
              return "2004级";
       }
}
//抽象工厂
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 {
       function printInfo($factory) {
              echo $factory->getGrade()->getYear().$factory->getPerson()->getName();
       }
       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();

想了解更多,来听公开课吧:http://www.ucai.cn/train?f=17

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/20771.html

相关文章

  • 优才公开笔记php设计模式(一) 单例模式

    摘要:最近开展了三次设计模式的公开课,现在来总结一下设计模式在中的应用,这是第一篇创建型模式之单例模式。不过因为不支持多线程所以不需要考虑这个问题了。 最近开展了三次设计模式的公开课,现在来总结一下设计模式在PHP中的应用,这是第一篇创建型模式之单例模式。 一、设计模式简介 首先我们来认识一下什么是设计模式: 设计模式是一套被反复使用、容易被他人理解的、可靠的代码设计经验的总结。 设计模式不...

    guyan0319 评论0 收藏0
  • 优才公开笔记php设计模式 (四)原型模式

    摘要:继续分享设计模式的公开课,这是第四篇创建型模式之原型模式设计模式的一般介绍在第一篇文章讲了,不了解的可以先看看。设计模式的第一部分,创建型模式就总结完了。下面还有两部分结构型设计模式和行为型设计模式稍后继续。 继续分享设计模式的公开课,这是第四篇创建型模式之原型模式 设计模式的一般介绍在第一篇文章讲了,不了解的可以先看看。 原型模式: 用原型实例指定创建对象的种类,并且通过拷贝这个...

    Maxiye 评论0 收藏0
  • 优才公开笔记php设计模式 (三)创建者模式

    摘要:继续分享设计模式的公开课,这是第三篇创建型模式之创建者模式设计模式的一般介绍在第一篇文章讲了,不了解的可以先看看。 继续分享设计模式的公开课,这是第三篇创建型模式之创建者模式 设计模式的一般介绍在第一篇文章讲了,不了解的可以先看看。 创建者模式: 在创建者模式中,客户端不再负责对象的创建与组装,而是把这个对象创建的责任交给其具体的创建者类,把组装的责任交给组装类,客户端支付对对象的...

    bladefury 评论0 收藏0
  • 技术攻略】php设计模式(一):简介及创建型模式

    摘要:我们分三篇文章来总结一下设计模式在中的应用,这是第一篇创建型模式。二提炼设计模式的几个原则开闭原则模块应对扩展开放,而对修改关闭。工厂模式实现定义一个用于创建对象的接口,让子类决定实例化哪一个类。设计模式的第一部分,创建型模式就总结完了。 我们分三篇文章来总结一下设计模式在PHP中的应用,这是第一篇创建型模式。一、设计模式简介 首先我们来认识一下什么是设计模式: 设计模式是一套被反复使...

    dongxiawu 评论0 收藏0
  • 【编程堂】php设计模式():结构型模式(续)

    摘要:能够协调调用者和被调用者,能够在一定程度上降低系统的耦合性。特点低耦合性,独立性好,安全性应用客户访问不到或者被访问者希望隐藏自己,所以通过代理来访问自己。 我们接着上面的几种模式继续讲: 4、组合模式 将对象组合成树形结构表示部分-整体的层次结构。 特点:灵活性强 应用:对象的部分-整体的层次结构,模糊组合对象和简单对象处理问题 代码实现 /** 组合模式* *///继承模式clas...

    Nekron 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<