资讯专栏INFORMATION COLUMN

PHP设计模式之工厂模式

imtianx / 574人阅读

摘要:根据抽象程度的不同,工厂模式分为三种简单工厂模式工厂方法模式抽象工厂模式讲解简单工厂模式简单工厂模式又称静态工厂方法模式,之所以可以这么说,是因为简单工厂模式是通过一个静态方法来创建对象的。他可以解决简单工厂模式中的封闭开放原则问题。

概念

工厂模式是我们最常用的实例化对象模式,是用工厂方法代替new操作的一种模式。

使用工厂模式的好处是,如果你想要更改所实例化的类名等,则只需更改该工厂方法内容即可,不需逐一寻找代码中具体实例化的地方(new处)修改了。为系统结构提供灵活的动态扩展机制,减少了耦合。

根据抽象程度的不同,PHP工厂模式分为三种:

简单工厂模式

工厂方法模式

抽象工厂模式

讲解 简单工厂模式

简单工厂模式又称静态工厂方法模式,之所以可以这么说,是因为简单工厂模式是通过一个静态方法来创建对象的。

代码示例:

";
    }
}

/**
 * Class women 继承people的女人类
 */
class women implements people
{
    // 具体实现people的say方法
    public function say()
    {
        echo "我是女人
"; } } /** * Class SimpleFactoty 工厂类 */ class SimpleFactoty { // 简单工厂里的静态方法-用于创建男人对象 static function createMan() { return new man(); } // 简单工厂里的静态方法-用于创建女人对象 static function createWomen() { return new women(); } } /** * 具体调用 */ $man = SimpleFactoty::createMan(); $man->say(); $woman = SimpleFactoty::createWomen(); $woman->say();

运行结果:

我是男人
我是女人
工厂方法模式

定义一个用于创建对象的接口,让子类决定哪个类实例化。 他可以解决简单工厂模式中的封闭开放原则问题。

看代码:

";
    }
}

/**
 * Class women 继承people的女人类
 */
class women implements people
{
    // 实现people的say方法
    function say()
    {
        echo "我是女人-hi
"; } } /** * Interface createPeople 创建人物类 * 注意:与上面简单工厂模式对比。这里本质区别在于,此处是将对象的创建抽象成一个接口。 */ interface createPeople { public function create(); } /** * Class FactoryMan 继承createPeople的工厂类-用于实例化男人类 */ class FactoryMan implements createPeople { // 创建男人对象(实例化男人类) public function create() { return new man(); } } /** * Class FactoryMan 继承createPeople的工厂类-用于实例化女人类 */ class FactoryWomen implements createPeople { // 创建女人对象(实例化女人类) function create() { return new women(); } } /** * Class Client 操作具体类 */ class Client { // 具体生产对象并执行对象方法测试 public function test() { $factory = new FactoryMan(); $man = $factory->create(); $man->say(); $factory = new FactoryWomen(); $man = $factory->create(); $man->say(); } } // 执行 $demo = new Client; $demo->test();

看结果:

我是男人-hi
我是女人-hi
抽象工厂模式

提供一个创建一系列相关或相互依赖对象的接口。

注意:这里和工厂方法的区别是:一系列(多个),而工厂方法只有一个。

代码:

";
    }
}

/**
 * Class TwoMan 第二个男人类-继承people
 */
class TwoMan implements people{
    // 实现people的say方法
    public function say()
    {
        echo "男2:我看上你了
"; } } /** * Class OneWomen 第一个女人类-继承people */ class OneWomen implements people { // 实现people的say方法 public function say() { echo "女1:我不喜欢你
"; } } /** * Class TwoWomen 第二个女人类-继承people */ class TwoWomen implements people { // 实现people的say方法 public function say() { echo "女2:滚一边玩去
"; } } /** * Interface createPeople 创建对象类 * 注意:这里将对象的创建抽象成了一个接口。 */ interface createPeople { // 创建第一个 public function createOne(); // 创建第二个 public function createTwo(); } /** * Class FactoryMan 用于创建男人对象的工厂类-继承createPeople */ class FactoryMan implements createPeople { // 创建第一个男人 public function createOne() { return new OneMan(); } // 创建第二个男人 public function createTwo() { return new TwoMan(); } } /** * Class FactoryWomen 用于创建女人对象的工厂类-继承createPeople */ class FactoryWomen implements createPeople { // 创建第一个女人 public function createOne() { return new OneWomen(); } // 创建第二个女人 public function createTwo() { return new TwoWomen(); } } /** * Class Client 执行测试类 */ class Client { // 具体生成对象和执行方法 public function test() { // 男人 $factory = new FactoryMan(); $man = $factory->createOne(); $man->say(); $man = $factory->createTwo(); $man->say(); // 女人 $factory = new FactoryWomen(); $man = $factory->createOne(); $man->say(); $man = $factory->createTwo(); $man->say(); } } // 执行 $demo = new Client; $demo->test();

结果:

男1:我喜欢你
男2:我看上你了
女1:我不喜欢你
女2:滚一边玩去
总结 区别

简单工厂模式(静态方法工厂模式) : 用来生产同一等级结构中的任意产品。(不能增加新的产品)

工厂模式 :用来生产同一等级结构中的固定产品。(支持增加任意产品)

抽象工厂 :用来生产不同产品种类的全部产品。(不能增加新的产品,支持增加产品种类)

适用范围

简单工厂模式:

工厂类负责创建的对象较少,操作时只需知道传入工厂类的参数即可,对于如何创建对象过程不用关心。

工厂方法模式:

满足以下条件时,可以考虑使用工厂模式方法

当一个类不知道它所必须创建对象的类时

一个类希望由子类来指定它所创建的对象时

当类将创建对象的职责委托给多个帮助子类中得某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时

抽象工厂模式:

满足以下条件时,可以考虑使用抽象工厂模式

系统不依赖于产品类实例如何被创建,组合和表达的细节。

系统的产品有多于一个的产品族,而系统只消费其中某一族的产品

同属于同一个产品族是在一起使用的。这一约束必须在系统的设计中体现出来。

系统提供一个产品类的库,所有产品以同样的接口出现,从而使客户端不依赖于实现。

以上几种,归根结底,都是将重复的东西提取出来,以方便整体解耦和复用,修改时方便。可根据具体需求而选择使用。

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

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

相关文章

  • PHP面试常考设计模式——工厂模式

    摘要:工厂模式其实可以划分为简单工厂模式工厂方法模式抽象工厂模式等。简单工厂模式介绍简单工厂模式又称为静态工厂方法模式,它属于类创建型模式。此模式是对工厂方法模式的进一步扩展。 你好,是我琉忆,PHP程序员面试笔试系列图书的作者。 本周(2019.3.11至3.15)的一三五更新的文章如下: 周一:PHP面试常考之设计模式——工厂模式周三:PHP面试常考之设计模式——建造者模式周五:PHP...

    Jiavan 评论0 收藏0
  • 优才公开课笔记:php设计模式 (二)工厂模式

    摘要:但本质是,简单工厂并未严格遵循设计模式的开闭原则,当需要增加新产品时也需要修改工厂代码。但是工厂方法则严格遵守开闭原则,模式只负责抽象工厂接口,具体工厂交给客户去扩展。 最近开展了三次设计模式的公开课,现在来总结一下设计模式在PHP中的应用,这是第二篇创建型模式之工厂模式。 设计模式的一般介绍在第一篇文章讲了,这里就不重复。 工厂模式 实现:定义一个用于创建对象的接口,让子类决定实...

    aisuhua 评论0 收藏0
  • php 设计模式工厂模式、单例模式、注册树模式

    摘要:的设计模式有很多种,本文取最简单的三种模式工厂模式单例模式和注册树模式进行简单的讲解。文件创建完后,咱们回到单元测试文件文件再执行一下单元测试命令发现,也能返回成功,这样的话我们就能很方便的修改任何驱动了。 php 设计模式之工厂模式、单例模式、注册树模式 在软件工程中,创建型设计模式承担着对象创建的职责,尝试创建适合程序上下文的对象,对象创建设计模式的产生是由于软件工程设计的问题,具...

    liangzai_cool 评论0 收藏0
  • PHP 设计模式工厂模式 (静态工厂模式)

    摘要:工厂模式由工厂类根据参数来决定创建出哪一种产品类的实例。工厂类是指包含了一个专门用来创建其他对象的方法的类。工厂模式的最主要作用就是对象创建的封装简化创建对象操作。 ### 工厂模式: 由工厂类根据参数来决定创建出哪一种产品类的实例。工厂类是指包含了一个专门用来创建其他对象的方法的类。所谓按需分配,传入参数进行选择,返回具体的类。工厂模式的最主要作用就是对象创建的封装、简化创建对象操作...

    kviccn 评论0 收藏0
  • PHP 设计模式二——工厂模式

    摘要:连接邮件服务器的类可以连接邮件服务器的方法有,此时可以写一个工厂类负责实例化这几种连接方法,如果某一天对方增加了连接方法,那么直接在工厂类里做相应的修改即可。扩展性高,如果想增加一个产品,只要扩展一个工厂类或者是修改工厂的生产过程即可。 定义 工厂模式的使用频率比较高。它的定义为:定义一个类,该类主要负责系统的去实例化一些其它的类。通俗点说就是,你告诉我你需要哪个类的实例即可,其它的你...

    cc17 评论0 收藏0

发表评论

0条评论

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