设计模式-使用php实现工厂方法模式



【概要】

创建型模式

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

【结构图】

【主要角色】

抽象产品(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 "学生做作业!\n";
}
} class Teacher implements Work { function doWork(){
echo "老师批改作业!\n";
}
} //抽象工厂
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 = "Please input the '+', '-', '*', '/' symbols of Math.";
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(), "\n";
exit;
}
}
} //工厂创建实例
$obj = OperationFactory::CreateOperation('*');
$obj->setNumber(3, 4);
echo $obj->getResults();
?>

php实现工厂模式的更多相关文章

  1. 23种设计模式--工厂模式-Factory Pattern

    一.工厂模式的介绍       工厂模式让我们相到的就是工厂,那么生活中的工厂是生产产品的,在代码中的工厂是生产实例的,在直白一点就是生产实例的类,代码中我们常用new关键字,那么这个new出来的实例 ...

  2. javascript工厂模式和构造函数模式创建对象

    一.工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程(本书后面还将讨论其他设计模式及其在JavaScript 中的实现).考虑到在ECMAScript 中无法创 ...

  3. PHP设计模式(三)抽象工厂模式(Abstract Factory For PHP)

    一.什么是抽象工厂模式 抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象 ,而且使用抽象工厂模式还要满足以下条件: 系统中有多个产品族,而系统一次只可能消费其中一族产品. 同 ...

  4. PHP设计模式(一)简单工厂模式 (Simple Factory For PHP)

    最近天气变化无常,身为程序猿的寡人!~终究难耐天气的挑战,病倒了,果然,程序猿还需多保养自己的身体,有句话这么说:一生只有两件事能报复你:不够努力的辜负和过度消耗身体的后患.话不多说,开始吧. 一.什 ...

  5. 设计模式之工厂模式VS抽象工厂

    一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类:1)简单工厂模式(Simple Factor ...

  6. 菜鸟理解的工厂模式(Factory Pattern)是什么样子的?

    直接开始说了,不浪费园友宝贵的时间! 什么是工厂模式? 在学习前,先问一下:"它是什么?". 工厂模式,它是项目里面常用的设计模式之一. 它是属于创建型模式,简单的理解创建型模式就 ...

  7. PHP 面向对象编程和设计模式 (3/5) - 单例模式和工厂模式

    PHP高级程序设计 学习笔记 2014.06.11 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容 ...

  8. 《JS设计模式笔记》构造函数和工厂模式创建对象

    工厂模式 function createPerson (name,age,job) { var o=new Object(); o.name=name; o.age=age; o.job=job; o ...

  9. 从接口、抽象类到工厂模式再到JVM来总结一些问题

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习! 涉及到的知识点总结如下: 为什么使用接口? 接口和抽象类的区别 简单工厂模式总结 Java中new和newInstance的区别 J ...

  10. C#设计模式之简单工厂模式(Simple Factory)

    1. 概述 简单工厂模式就是将一个类的实例化交给一个静态工厂来执行. 2. 使用频率 中 3. 模式结构 3.1 机构图 3.2 模式中的角色 Product:抽象类,把具体产品类公共的代码进行抽象和 ...

随机推荐

  1. 如何在Docker中部署DzzOffice

    一.一些背景 之前研究Docker很久了,并且在公司内部实际使用起来了,目前分两种场景使用Docker 1.作为PAAS,提供一致,统一的编译/测试环境: 2.作为虚拟机,直接分配给新来的开发人员使用 ...

  2. windows下django1.7 +python3.4.2搭建记录2

    1.自定义页面写一个显示当前时间的页面views.py文件加一个使用模板的模块,整体内容为: #coding=utf-8 from django.shortcuts import render fro ...

  3. ChromePHP - Chrome浏览器下的PHP debug工具

    一款 Chrome 下用来配合调试 PHP 的工具,看官方介绍应该和 FirePHP 有异曲同工的.喜欢用Chrome 的PHPer 可以尝试一下. 官方网站:http://www.chromephp ...

  4. Spark connect to Database

    Cannect to Cassandra: 用spark-cassandra-connector, 注意spark,cassandra和connector的版本要配套,Cassandra至少要版本2以 ...

  5. Http状态码的种类及含义

    1xx 临时响应:2xx 成功:3xx 重定向: 4xx 请求错误: 5xx 服务器错误: http://www.hostspaces.net/wenzhang-detail.php?id=198 常 ...

  6. flappy pig小游戏源码分析(1)——主程序初探

    闲逛github发现一个javascript原生实现的小游戏,源码写的很清晰,适合想提高水平的同学观摩学习.读通源码后,我决定写一系列的博客来分析源码,从整体架构到具体实现细节来帮助一些想提高水平的朋 ...

  7. asp.net mvc 使用Ajax

    使用asp.net mvc 调用Action方法很简单. 一.无参数方法. 1.首先,引入jquery-1.5.1.min.js 脚本,根据版本不同大家自行选择. <script src=&qu ...

  8. oracle 体系结构解析

    三.oracle 体系结构 1.oracle内存由SGA+PGA所构成 2.oracle数据库体系结构数据库的体系结构是指数据库的组成.工作过程与原理,以及数据在数据库中的组织与管理机制. oracl ...

  9. Hadoop学习笔记3---安装并运行Hadoop

    本文环境是在Ubuntu10.04环境下运行的. 在Linux上安装Hadoop之前,首先安装两个程序: 1.JDK1.6(或更高版本).Hadoop是用Java编写的程序,Hadoop编译及MapR ...

  10. ios8 下请求读取通讯录权限 (网上众多资料漏下得一个坑)

    读取通讯录权限网上都有,不再叙述. 当第一次授权时用户假如拒绝授权, 第二次就无法再次弹出提示框授权. 刚开始时完全按照网上例子写的,第一次拒绝授权后,在设置里面无法找到对应的更改读取权限的选项. 后 ...