php实现工厂模式
设计模式-使用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实现工厂模式的更多相关文章
- 23种设计模式--工厂模式-Factory Pattern
一.工厂模式的介绍 工厂模式让我们相到的就是工厂,那么生活中的工厂是生产产品的,在代码中的工厂是生产实例的,在直白一点就是生产实例的类,代码中我们常用new关键字,那么这个new出来的实例 ...
- javascript工厂模式和构造函数模式创建对象
一.工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程(本书后面还将讨论其他设计模式及其在JavaScript 中的实现).考虑到在ECMAScript 中无法创 ...
- PHP设计模式(三)抽象工厂模式(Abstract Factory For PHP)
一.什么是抽象工厂模式 抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象 ,而且使用抽象工厂模式还要满足以下条件: 系统中有多个产品族,而系统一次只可能消费其中一族产品. 同 ...
- PHP设计模式(一)简单工厂模式 (Simple Factory For PHP)
最近天气变化无常,身为程序猿的寡人!~终究难耐天气的挑战,病倒了,果然,程序猿还需多保养自己的身体,有句话这么说:一生只有两件事能报复你:不够努力的辜负和过度消耗身体的后患.话不多说,开始吧. 一.什 ...
- 设计模式之工厂模式VS抽象工厂
一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类:1)简单工厂模式(Simple Factor ...
- 菜鸟理解的工厂模式(Factory Pattern)是什么样子的?
直接开始说了,不浪费园友宝贵的时间! 什么是工厂模式? 在学习前,先问一下:"它是什么?". 工厂模式,它是项目里面常用的设计模式之一. 它是属于创建型模式,简单的理解创建型模式就 ...
- PHP 面向对象编程和设计模式 (3/5) - 单例模式和工厂模式
PHP高级程序设计 学习笔记 2014.06.11 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容 ...
- 《JS设计模式笔记》构造函数和工厂模式创建对象
工厂模式 function createPerson (name,age,job) { var o=new Object(); o.name=name; o.age=age; o.job=job; o ...
- 从接口、抽象类到工厂模式再到JVM来总结一些问题
俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习! 涉及到的知识点总结如下: 为什么使用接口? 接口和抽象类的区别 简单工厂模式总结 Java中new和newInstance的区别 J ...
- C#设计模式之简单工厂模式(Simple Factory)
1. 概述 简单工厂模式就是将一个类的实例化交给一个静态工厂来执行. 2. 使用频率 中 3. 模式结构 3.1 机构图 3.2 模式中的角色 Product:抽象类,把具体产品类公共的代码进行抽象和 ...
随机推荐
- 改进duilib的richedit控件的部分功能
转载请说明原出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/41208207 如果要使用透明异形窗体功能,首先要改进duilib库让他本 ...
- Python 学习笔记(五)杂项
1. Assert assert len(unique_characters) <= 10, 'Too many letters' #…等价于: if len(unique_characters ...
- js中ajax如何解决跨域请求
js中ajax如何解决跨域请求,在讲这个问题之前先解释几个名词 1.跨域请求 所有的浏览器都是同源策略,这个策略能保证页面脚本资源和cookie安全 ,浏览器隔离了来自不同源的请求,防上跨域不安全的操 ...
- 提升c++builder 代码输入流畅度的配置
提高c++builder 代码输入流畅度 1.输入指针的函数名后,识别函数参数移动光标到括弧内,此功能太慢,有明显延迟,建议关闭.关闭以后,输入函数名不会自动添加(),需要自己手动输入括弧了,不过速度 ...
- 门户级UGC系统的技术进化路线——新浪新闻评论系统的架构演进和经验总结(转)
add by zhj:先收藏了 摘要:评论系统是所有门户网站的核心标准服务组件之一.本文作者曾负责新浪网评论系统多年,这套系统不仅服务于门户新闻业务,还包括调查.投票等产品,经历了从单机到多机再到集群 ...
- HDU 4870Rating(推公式)
有关这个题的高斯消元的方法已经在我的另一篇博客中给出http://www.cnblogs.com/gj-Acit/p/3888382.html 这里介绍一个很吊的解法,复杂度降到了O(n),以下转自h ...
- oracle创建自增长列
--创建一个新表 /*create table students(stu_id number,stu_name varchar2(20),stu_email varchar2(40),primary ...
- 计算直线的交点数(hdu1466简单的dp)
题意:平面上有n条直线,且无三线共点,问这些直线能有多少种不同交点数.比如,如果n=2,则可能的交点数量为0(平行)或者1(不平行). 思路:动态规划,想办法记忆化搜索,当前状态和之前状态结合起来 d ...
- hdoj 5328 Problems killer
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5328 #include<stdio.h> #include<algorithm> ...
- mysql中间件研究(Atlas,cobar,TDDL)
mysql-proxy是官方提供的mysql中间件产品可以实现负载平衡,读写分离,failover等,但其不支持大数据量的分库分表且性能较差.下面介绍几款能代替其的mysql开源中间件产品,Atlas ...