设为首页 收藏本站
查看: 925|回复: 0

[经验分享] php实现工厂模式

[复制链接]

尚未签到

发表于 2015-8-26 08:58:26 | 显示全部楼层 |阅读模式
设计模式-使用php实现工厂方法模式



【概要】

创建型模式

定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使用一个类的实例化延迟到其子类【GOF95】


  【结构图】
   DSC0000.gif

【主要角色】

抽象产品(Product)角色:详细产品对象共同拥有的父类或接口

详细产品(Concrete Product)角色:实现抽象产品角色所定义的接口,而且工厂方法模式所创建的每个对象都是某详细产品对象的实例

抽象工厂(Creator)角色:模式中不论什么创建对象的工厂类都要实现这个接口,它声明了工厂方法,该方法返回一个Product类型的对象。

Creator也能够定义一个工厂方法的缺省实现,它返回一个缺省的的ConcreteProduct对象

详细工厂(Concrete Creator)角色:实现抽象工厂接口,详细工厂角色与应用逻辑相关,由应用程序直接调用以创建产品对象。

【优缺点】

长处:工厂方法模式能够同意系统在不改动工厂角色的情况下引进新产品。

缺点:客户可能只为了创建一个特定的ConcreteProduct对象,就不得不创建一个Creator子类

【适用性】

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

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

3、当类将创建对象的职责托付给多个帮助子类的某一个,而且你希望将哪一个帮助子类是代理者这一信息局部化的时候
  【工厂模式php实例】
  <?php
/**
* 工厂方法模式
* -------------
* @author zhaoxuejie <zxj198468@gmail.com>
* @package design pattern
* @version v1.0 2011-12-14
*/
//抽象产品
interface Work {
public function doWork();
}
//详细产品实现
class Student implements Work {
function doWork(){
echo &quot;学生做作业!\n&quot;;
}
}
class Teacher implements Work {
function doWork(){
echo &quot;老师批改作业!\n&quot;;
}
}
//抽象工厂
interface WorkerFactory {
public function getWorker();
}
//详细抽象工厂实现
class StudentFactory {
function getWorker(){
return new Student();
}
}
class TeacherFactory {
function getWorker(){
return new Teacher();
}
}
//client
class Client {
static function main() {
$s = new Student();
$s->doWork();
$t = new Teacher();
$t->doWork();
}
}
Client::main();
?>


【简单工厂模式】

从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之中的一个。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单有用的模式,能够理解为是不同工厂模式的一个特殊实现。

【简单工厂模式php实例】


  <?php
/**
* 简单工厂模式
* -------------
* @author zhaoxuejie <zxj198468@gmail.com>
* @package design pattern
* @version v1.0 2011-12-14
*/
interface  Comput {
public function getResults();
}
//操作类
class Operation {
protected  $Number_A = 0;
protected  $Number_B = 0;
protected  $Result = 0;
//赋值
function setNumber($Number_A, $Number_B){
$this->Number_A = $Number_A;
$this->Number_B = $Number_B;
}
//清零
function clearResult(){
$this->Result = 0;
}
}
//加法
class OperationAdd extends Operation implements Comput {
function getResults(){
return $this->Result = ($this->Number_A + $this->Number_B);
}
}
//减法
class OperationSub extends Operation implements Comput {
function getResults(){
return $this->Result = ($this->Number_A - $this->Number_B);
}
}
//乘法
class OperationMul extends Operation implements Comput {
function getResults(){
return $this->Result = ($this->Number_A * $this->Number_B);
}
}
//除法
class OperationDiv extends Operation implements Comput {
function getResults(){
if(intval($this->Number_B) == 0){
return $this->Result = 'Error: Division by zero';
}
return $this->Result = ($this->Number_A / $this->Number_B);
}
}
//工厂
class OperationFactory {
private static $obj;
public static function CreateOperation($type){
try {
$error = &quot;Please input the '+', '-', '*', '/' symbols of Math.&quot;;
switch($type){
case '+' :
self::$obj = new OperationAdd();
break;
case '-' :
self::$obj = new OperationSub();
break;
case '*' :
self::$obj = new OperationMul();
break;
case '/' :
self::$obj = new OperationDiv();
break;
default:
throw new Exception($error);
}
return self::$obj;
} catch (Exception $e) {
echo 'Caught exception: ',  $e->getMessage(), &quot;\n&quot;;
exit;
}
}
}
//工厂创建实例
$obj = OperationFactory::CreateOperation('*');
$obj->setNumber(3, 4);
echo $obj->getResults();
?>

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-104284-1-1.html 上篇帖子: php 访问二维数组 下篇帖子: 在PHP中SESSION踩到的坑
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表