资讯专栏INFORMATION COLUMN

Chap3:创建型设计模式————工厂方法设计模式(上)

A Loity / 2711人阅读

摘要:利用工厂方法模式,请求者发出请求,而不具体创建产品。正是因为这个原因,使用工厂方法模式可以简化复杂的创建过程,关键就在于它在维持一个公共接口。

创建型设计模式

包括以下五种:

抽象工厂

生成器

工厂方法

原型

单例

我们选择工厂方法和原型模式作为将用PHP实现的创建型设计的例子
工厂方法模式是这5个设计模式中唯一的一种类设计模式
原型模式属于对象类模式,可以使用PHP_clone方法实现。首先基于原型实例化(创建)一个对象,然后由这个实例化对象进一步克隆其他对象
使用创建型模式时,最有意思的是,当程序和系统越来越依赖于对象组合而不是依赖于类继承时,创建型模式中的程序变成由对象构成的系统,而对象又由其他对象组合而成,所以任何单个对象的创建都不应该依赖于创建者

工厂方法模式

概念:工厂方法模式就是要创建某种东西,对于工厂方法模式,要创建的东西是一个产品,这个产品与创建它的类之间不存在绑定,为了保持这种松耦合,客户会通过一个工厂发出请求,再由工厂创建所请求的产品。利用工厂方法模式,请求者发出请求,而不具体创建产品。
何时使用:如果实例化对象的子类可能变化,就要使用工厂方法模式
Why:对象的数目和类型都是未知的,一个类无法预计它要创建的对象数目,所以你不希望类与它要创建的类紧密绑定

案例模型:

步骤:

第一步是建立工厂:Creator接口

factoryMethod();
        return $mfg;
    }
}
?>

注意到,伪代码注释提示startFactory()方法需要返回一个产品(product),在实现中startFactory()希望factoryMethod()返回一个产品对象,所以,factoryMethod()的具体实现要构建并返回由一个按Product接口实现的产品对象

下面有两个工厂类扩展了Creator,并实现了factoryMethod()方法,factoryMethod()实现通过一个Product方法(getProperties())返回一个文本或图像产品,TextFactory和GraphicFactory实现中加入了这些内容

getProperties());
    }
}
?>
getProperties());
    }
}
?>

工厂方法设计模式中的第二个接口是Product。由于这是第一个实现,也是最简单的实现,所有文本和图像属性都只实现一个方法getProperties():建立方法而无属性,我们可以明确想要用这个方法做什么(比如可以有个返回值),只要方法名和可见性与签名一致就不会有问题

可以利用这个实现,使得同一个方法getProperties()多态,分别返回图像和文字,如下所示

mfgProduct = "This is a TextmfgProduct;
    }
}
?>
mfgProduct = "This is a Graphic
"; return $this->mfgProduct; } } ?>

上面你看到的This is a Graphic以及This is text,可以替换成你想放入的其它东西,工厂设计会创建这个对象,并把它返回给Client来使用。
这两个工厂和产品分别覆盖了抽象方法,来创建两个不同的工厂和产品,它们都符合所实现的接口

客户
这个模式最后一个参与者是隐含的(上面模型图中颜色较淡的框):客户。我们并不希望Client类直接做出产品请求。实际上,我们希望能够通过Creator接口做出请求,这样一来,如果以后我们增加产品或者工厂,客户可以做同样的请求来得到更多类型的产品,而不会破坏这个应用

someGraphicObject = new GraphicFactory();
        echo $this->someGraphicObject->startFactory();
         $this->someTextObject = new TextFactory();
        echo $this->someTextObject->startFactory();
    }
}
$worker = new Client();
?>

注意Client对象并没有向产品直接做出请求,而是通过工厂来请求,重要的是,客户并不实现产品特性,而留给产品实现来体现。


在本章有个例子,是对上面代码的改进,也可以称作是在工厂中修改产品,但是本猿以为,例子似乎举的不是很好,它把Html代码嵌套在php代码中,放在了产品类下的getProperties方法中,以供客户调用的时候返回,所以我个人觉得这种方法不是很好,一大段代码放在php中,也不方便编辑器编辑。设计模式是为了加快开发速度,这样的方法我适得其反。作者是专家,可能也有出于其它考虑。不过里面有一个观点我还是同意的,其中有一个辅助类的观点。
所谓辅助类,就是把一些任务给一个多带带的对象来处理,而不是结合到某个参与者中。类似地,如果需要重用一组HTML标记,可以把它们打包到另一个对象中以便重用。下面是一个例子

topper = "
               
        
        Map Factory
         ";
        return $this->topper;
    }
    public function closeUp(){
        $this->bottom = "";
        return $this->bottom;
    }
}
?>

增加新产品和参数化请求

上图与之前的类图不同,它们完成同样的目标,不过它们的实现有所不同。这就是参数化工厂方法设计模式(上图)与一般的工厂方法设计模式(原类图)的主要区别之一,即客户包含工厂和产品的引用。在参数化请求中,Client类必须指定产品,而不只是产品工厂,factoryMethod()操作中的参数是由客户传入的一个产品,所以客户必须指出它想要的具体产品,不过,这个请求仍然通过Creator接口发出,所以,尽管客户包含一个产品引用,但通过Creator,客户仍与产品分离

一个工厂多个产品

对于大多数请求,参数化工厂方法更为简单,因为客户只需要处理一个具体工厂,工厂方法操作有一个参数,指示需要创建的产品。而在原来的设计中,每个产品都有自己的工厂,不需要另外传递参数,产品实现依赖于各个产品的特定工厂。

要从参数化工厂方法设计模式实现多个产品,只需使用Product接口实现多个具体产品,另外,由于具体产品要同时包含文本和图像,所以在这个例子中,并不是分别有这两个多带带的产品,可以建立一个类,将文本和图像作为一个同意的实体来处理,这并不违反单一职责原则,即每个类应当只有一个职责。对于这个类来说,这个单一职责就是显示描述一个区域的文本和图像

新工厂

新工厂与原来的工厂类似,不过它们还包含一个参数和代码提示。

factoryMethod($countryProduct);
        return $mfg;
    }
}
?>

新的Creator抽象类中可以看到,factoryMethod()和startFactory操作都需要一个参数。另外代码提示只是了一个Product对象,而不是Prodcut一个特定实现,所以可以接受Product的任何具体实例,下面来看看具体的创建者CountryFactory

country = $product;
        return ($this->country->getProperties());
    }
}
?>

这个具体创建者包含一个私有变量$country,其中包含客户请求的特定产品,它再使用Product方法getProperties()将产品返回给客户

与试图让任意数目的类和对象都保持不变相比,保持接口不变要容易得多。正是因为这个原因,使用工厂方法模式可以简化复杂的创建过程,关键就在于它在维持一个公共接口

本文参考书籍:《Learnig PHP设计模式》第2部分第5章

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

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

相关文章

  • Chap3创建设计模式————工厂方法设计模式(下)

    摘要:上章讲的是创建型的设计模式,工厂方法上,这次要讲的是另一本书关于工厂方法的一些概念以及案例模型等等。工厂方法模式假设你有一个关于个人事务管理的项目,功能之一是管理预约对象。 上章讲的是创建型的设计模式,工厂方法(上),这次要讲的是另一本书关于工厂方法的一些概念以及案例、模型等等。就像电影风雨哈佛路中那个老师提问,为什么要用另外的一张一张纸质资料,而不直接用书籍。女主回答说,因为不同的资...

    ephererid 评论0 收藏0
  • Learning PHP —— 设计模式 | Chap2:设计模式与UML

    摘要:设计模式设计模式基本原则设计原则按接口而不是按实现来编程按接口而不是按实现编程是指,要将变量设置为一个抽象类或接口数据类型的实例,而不是一个具体实现的实例。例如父类的一个改变会逐级向下传递给子类实现,这可能会影响子类使用的某个算法。 设计模式 设计模式基本原则 设计原则 ① : 按接口而不是按实现来编程 按接口而不是按实现编程是指,要将变量设置为一个抽象类或接口数据类型的实例,而不是一...

    senntyou 评论0 收藏0
  • PHP 设计模式概述

    摘要:创建型模式主要有以下五种简单工厂模式和工厂方法模式抽象工厂模式单例模式建造者模式原型模式在设计模式一书中将工厂模式分为两类工厂方法模式与抽象工厂模式。 一、 设计模式(Design pattern)是什么 设计模式是一套被反复使用、多数人知晓、经过分类编目的代码设计的经验总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 二、 为什么会有设计模式 在软件开发过...

    IntMain 评论0 收藏0
  • 设计模式--简化解释(一)——创建设计模式

    摘要:维基百科在软件工程中,创建型设计模式是用于解决对象创建机制,尝试在指定场景下使用合理的方式来创建对象的设计模式。维基百科说建造者模式是一种对象创建软件设计模式,其目的是找到一种解决方案,以解决可伸缩构造函数的反模式。 1.创建型设计模式2.结构型设计模式3.行为型设计模式 创建型设计模式 简而言之 创建型设计模式关注的是如何实例化一个或者一组相关的对象。 维基百科 在软件工程中,创建型...

    iKcamp 评论0 收藏0
  • JavaScript设计模式第一弹-创建设计模式

    摘要:前言接下来将会为大家介绍设计模式中的创建型设计模式,在此之前需要掌握一定的对象继承基础。但是如果是工厂方法模式的话,则只需要往工厂方法中添加基类则可以。 前言 接下来将会为大家介绍设计模式中的创建型设计模式,在此之前需要掌握一定的JavaScript对象继承基础。 简单工厂模式 先说说 什么是简单工厂模式:又叫静态工厂方法,由一个工厂对象决定创建某一种产品对象类的实例 看着定义有点懵,...

    陈江龙 评论0 收藏0

发表评论

0条评论

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