4. 星际争霸之php设计模式--工厂方法模式

题记
==============================================================================
本php设计模式专辑来源于博客(jymoz.com),现在已经访问不了了,这一系列文章是我找了很久才找到完整的,感谢作者jymoz的辛苦付出哦!

本文地址:http://www.cnblogs.com/davidhhuan/p/4248177.html
==============================================================================


PHP手册上提到的工厂模式,其实是简单工厂模式。这里来讨论简单工厂模式的扩展:工厂方法模式。

待解决的问题:虽然简单工厂解决了动态返回不同类型对象的问题,但是实际情况当中,往往在新建一个对象的时候,需要做一些额外处理,比如制造机枪兵的时候需要判断水晶矿是否大于50,而制造火焰兵的时候需要同时判断水晶矿是否大于50和气矿大于25,还有是否建造了研究院。如果把这些代码全部放到工厂制造类里面,会使得制造类很臃肿,而且随着工厂生产的对象的种类越来越多,工厂制造类的代码会越来越难以维护。

思路:简单工厂模式中的工厂类(兵种制造器的类)保持不变,增加一个制造接口,定义一个实际制造对象的方法,然后定义各个具体制造不同对象的工厂,同时要求这些工厂执行这个制造接口,让这些工厂去实现实际制造对象的方法。

工厂方法模式示例:

我们把机枪兵类和制造机枪兵的类的代码放入一个文件,Marine.php,它的代码如下:

<?php//机枪兵类class Marine {//机枪兵攻击的方法public function attack(){echo 'Marine attack';}}//制造机枪兵的类,执行接口abstractCreatorclass MarineCreator implements abstractCreator {//实际制造机枪兵的方法public function realCreate(){//如果水晶矿大于50,这里只是作为说明,因为并不存在ore这个变量,也不考虑水晶少于50的处理if($ore>50){return new Marine();}}}
?>

我们把火焰兵类和制造火焰兵的类的代码放入一个文件,Firebat.php,它的代码如下:

<?php//火焰兵类class Firebat {//火焰兵攻击的方法public function attack(){echo 'Firebat attack';}}//制造火焰兵的类,执行接口abstractCreatorclass FirebatCreator implements abstractCreator{//实际制造火焰兵的方法public function realCreate(){//如果水晶矿大于50同时气矿大于25,并且研究院已经存在。这里只是作为说明,因为并不存在ore和gas和Academy变量,也不考虑资源不够时的处理if($ore>50 && $gas>25 && Academy>1){return new Firebat();}}}
?>

主文件中的内容如下:

<?php//各个具体工厂必须执行的接口interface abstractCreator {//规定各个具体工厂要实现的方法public function realCreate();}//兵种制造器的类,也就是主工厂class BarracksCreator {//制造兵种的方法public create($createWhat){//根据输入的参数,动态的把需要的类的定义文件载入require_once($createWhat.'.php');//根据输入的参数,动态的获取相应的具体工厂的类的名字$creatorClassName = $createWhat.'Creator';//新建具体工厂对象$creator = new $creatorClassName;//用具体工厂来实际生产,然后返回需要的类的对象。因为它们都执行了接口abstractCreator,所以肯定实现了方法realCreate()return $creator->realCreate();}}//新建一个兵种制造器对象$creator = new BarracksCreator();//靠接收参数制造一个火焰兵对象$troop1 = $creator->create('Marine');$troop1->attack();//靠接收参数制造一个机枪兵对象$troop2 = $creator->create('Firebat');$troop2->attack();?>

用途总结:工厂方法模式将新建对象的任务将给对应的具体工厂类,不必因为某些生产的对象需要进行额外处理而修改对外的主工厂。

实现总结:需要接收参数的主工厂类,比如上面兵种制造器BarracksCreator,还需要声明具体制造方法的一个接口,比如上面abstractCreator,然后定义具体生产各个产品的具体工厂类,每个具体工厂类必须执行接口abstractCreator,这样他们就必须实现制造对象的方法,比如上面的realCreate()。使用的时候只需要将参数传递给主工厂类工厂的生产方法create(),然后由create()根据参数生成具体工厂类的对象,并调用具体工厂类realCreate()获取制造的产品对象并返回,对外界使用来说,只需调用主工厂类工厂进行生产。
说明:其实这篇文章内的工厂方法模式和有些文章写的不同,标准的工厂模式往往是用一个抽象类来代替上面的接口abstractCreator,然后让所有的具体工厂类来继承它,但使用的时候,由于抽象类不能实例化(新建它的对象),所以经常是代码中直接new FirebatCreator(),但是简单工厂模式可以解决直接new的问题,所以我这里将简单工厂模式和工厂方法模式一起使用,使这里的示例更加实用。同时由于PHP是单继承,而执行接口的数量是没有限制的,所以使用接口abstractCreator更加灵活。

 

相关文章:

 

1. 星际争霸之php面向对象(一)

2. 星际争霸之php面向对象(二)

3. 星际争霸之php设计模式--简单工厂模式

4. 星际争霸之php设计模式--工厂方法模式

5. 星际争霸之php设计模式--抽象工厂模式

6. 星际争霸之php设计模式--建造器模式

7. 星际争霸之php设计模式--中介者模式

8. 星际争霸之php设计模式--享元模式

9. 星际争霸之php设计模式--代理模式

10. 星际争霸之php设计模式--原型模式

11. 星际争霸之php设计模式--备忘模式

12. 星际争霸之php设计模式--模板模式

13. 星际争霸之php设计模式--正面模式

14. 星际争霸之php设计模式--状态模式

15. 星际争霸之php设计模式--策略模式

16. 星际争霸之php设计模式--组合模式

17. 星际争霸之php设计模式--职责链模式

18. 星际争霸之php设计模式--观察者模式

19. 星际争霸之php设计模式--迭代器模式

​20. 星际争霸之php设计模式--适配器模式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/545401.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle 建立序列以及触发器的建立

笔记系列 序列&#xff1a;序列的创建方法&#xff0c;以及插入数据时的使用&#xff1b; --序列的创建 create sequence sq increment by 1 start with 1 maxvalue 10 minvalue 1 cycle cache 5--一般(一个序列可以用在多张表&#xff0c;但是一般情况下&#xff0c;一张表对应…

实战:Redis 性能测试

为什么需要性能测试? 性能测试的使用场景有很多,例如以下几个: 技术选型,比如测试 Memcached 和 Redis;对比单机 Redis 和集群 Redis 的吞吐量;评估不同类型的存储性能,例如集合和有序集合;对比开启持久化和关闭持久化的吞吐量;对比调优和未调优的吞吐量;对比不同 R…

操作系统Ubuntu(实验三四)

实验三四3._实验三&#xff1a;Linux进程/线程的异步并发执行3.1_fork()函数创建子进程3.2_创建线程pthread_create();4._实验四&#xff1a;使用信号量进行互斥与同步4.1_信号量初使用&#xff08;1&#xff09;信号量简单介绍&#xff08;2&#xff09;信号量以及P、V操作的使…

Java RandomAccessFile writeShort()方法与示例

RandomAccessFile类writeShort()方法 (RandomAccessFile Class writeShort() method) writeShort() method is available in java.io package. writeShort()方法在java.io包中可用。 writeShort() method is used to write the short value to the file as 2 bytes directly wi…

js中cookie的使用详细分析

cookie概述 cookie 是浏览器提供的一种机制&#xff0c;它将document 对象的cookie属性提供给JavaScript。可以由JavaScript对其进行控制&#xff0c;而并不是JavaScript本身的性质。cookie是 存于用户硬盘的一个文件&#xff0c;这个文件通常对应于一个域名&#xff0c;当浏览…

实战:Redis哨兵模式(上)

上一篇我们讲了主从复制模式,它是属于 Redis 多机运行的基础,但这种模式本身存在一个致命的问题,当主节点奔溃之后,需要人工干预才能恢复 Redis 的正常使用。 例如,我们有 3 台服务器做了主从复制,一个主服务器 A 和两个从服务器 B、C,当 A 发生故障之后,需要人工把 B…

Oracle plsql 打包

--打包 --创建包 --步骤&#xff1a; --1、声明&#xff08;创建包头&#xff09; --2、创建数据对象&#xff08;创建包体&#xff09;--1、 create or replace package myPack asv_bookCount integer;procedure p_back(v_stuid borrow.stuid%type,v_bid borrow.bid%type);fun…

计算机网络(第四章网络层)

第四章网络层4.1_网络层提供的两种服务&#xff08;1&#xff09;虚电路服务&#xff08;2&#xff09;数据报服务4.2_网络协议4.2.1_虚拟互连网络4.2.2_分类的IP地址&#xff08;1&#xff09;分类IP地址三种分类方法IP 地址的一些重要特点4.2.3_IP地址与硬件地址4.2.4_地址解…

Java ObjectInputStream readShort()方法(带示例)

ObjectInputStream类readShort()方法 (ObjectInputStream Class readShort() method) readShort() method is available in java.io package. readShort()方法在java.io包中可用。 readShort() method is used to read 2 bytes of short value from this ObjectInputStream. re…

实战:Redis 主从同步

主从同步(主从复制)是 Redis 高可用服务的基石,也是多机运行中最基础的一个。我们把主要存储数据的节点叫做主节点 (master),把其他通过复制主节点数据的副本节点叫做从节点 (slave),如下图所示: 在 Redis 中一个主节点可以拥有多个从节点,一个从节点也可以是其他服务…

Oracle view 小结片段

以前下载了一个关于Oracle 视图的pdf&#xff0c;水平有限&#xff0c;没看懂多少。 版本信息&#xff1a; select * from v$version; 数据库信息&#xff1a; select name, created, log_mode from v$database; 基本的许可信息 select * from v$license; 数据库中已安装的…

idea连接sqlserver及数据库操作

idea连接sqlserver及操作一、在连接过程中遇到的问题&#xff1a;&#xff08;1&#xff09;数据库登录失败&#xff08;2&#xff09;登录成功之后数据库端口号怎么查看二、代码连接数据库①加载驱动和连接数据库三、数据库操作连接详解链接 总体流程链接 操作实例链接 一、…

Java ObjectInputStream readFloat()方法与示例

ObjectInputStream类readFloat()方法 (ObjectInputStream Class readFloat() method) readFloat() method is available in java.io package. readFloat()方法在java.io包中可用。 readFloat() method is used to read 4 bytes (i.e. 32 bit) of float value from this ObjectI…

实战:Redis 集群模式(上)

Redis Cluster 是 Redis 3.0 版本推出的 Redis 集群方案,它将数据分布在不同的服务区上,以此来降低系统对单主节点的依赖,并且可以大大的提高 Redis 服务的读写性能。 Redis 将所有的数据分为 16384 个 slots(槽),每个节点负责其中的一部分槽位,当有 Redis 客户端连接集…

java 调用 Oracle 存储过程

一个函数本质上一个返回一个结果的存储过程&#xff0c;这个例子示范了怎么调用有in、out和in/out参数的函数。 大同小异的方法。    CallableStatement cs; try { // 调用一个没有参数的函数; 函数返回 a VARCHAR // 预处理callable语句 cs connection.prepareCall("…

连接数据库实例

idea连接数据库步骤详解 package com.company; import java.sql.*; public class Main {public static void main(String[] args) {Student student new Student();try {SqlOperation.main();ResultSet resultSet ScoreSql.selectScoreSql();//输出所有行操作while(resultSe…

实战:Redis 哨兵模式(下)

上一篇我们介绍了 Redis Sentinel 的搭建和运行原理,本文我们重点来看下 Sentinel 的命令操作和代码实战。 Sentinel 命令操作 要使用 Sentinel 实现要连接到 Sentinel 服务器,和连接 Redis 服务相同,我们可以使用 redis-cli 来连接 Sentinel,如下命令所示: [@iZ2ze0nc…

java事务处理

有个同学给我的文档&#xff0c;直接发上来了&#xff0c; 在数据库操作中&#xff0c;一项事务是指由一条或多条对数据库更新的sql语句所组成的一个不可分割的工作单元。只有当事务中的所有操作都正常完成了&#xff0c;整个事务才能被提交到数据库&#xff0c;如果有一项操作…

vsftp配置参数

vsftp配置参数 转载&#xff1a;http://blog.chinaunix.net/uid-134240-id-172158.html listen_addressip address 指定侦听IP listen_portport_value 指定侦听端口&#xff0c;默认21 anonymous_enableYES 是否允许使用匿名帐户 local_enableYES 是否允许本地用户登录 …

Java文件类boolean canWrite()方法(带示例)

文件类boolean canWrite() (File Class boolean canWrite()) This method is available in package java.io.File.canRead(). 软件包java.io.File.canRead()中提供了此方法。 This method is used to write the file and the file is represented by the abstract filepath or …