php实现工厂模式

php实现工厂模式

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

【概要】


创建型模式


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

【结构图】

<span>php实现工厂模式</span>

【主要角色】


抽象产品(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();
?>

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/119145.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • JAVA string转map_java怎么转业务

    JAVA string转map_java怎么转业务String转Mapstring转map的时候,很多新人可能不会去判断string的内容是什么格式的,因为map是key-value格式的,但是string就是一个字符串,想想,这个应该不能转吧,我就遇到过,想想就觉得自己傻傻的,哈哈哈。看代码 Stringcontent=””;HashMap<String,Object>map=newHashMap<>();try{map=JS

  • leetcode链表问题_反转一个单链表

    leetcode链表问题_反转一个单链表给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。示例 1:输入:head = [1,2,3,4,5], left = 2, right = 4输出:[1,4,3,2,5]示例 2:输入:head = [5], left = 1, right = 1输出:[5] 提示:链表中节点数目为 n1 <= n <= 500-500

  • rfid-rc522模块中文资料_驱动模块

    rfid-rc522模块中文资料_驱动模块文章目录一.S50(M1)卡介绍1.S50(M1)卡基础知识2.内部信息3.存取控制4.数据块的存取控制5.控制块的存取控6.工作原理7.M1与读卡器的通信一.S50(M1)卡介绍1.S50(M1)卡基础知识1.每张卡有唯一的序列号,32位2.卡的容量是8Kbit的EEPROM3.分为16个扇区,每个扇区分为4块,每块16个字节,以块为存取单位4.每个扇区都有独立的一组密码和访问控制…

  • Group Convolution 分组卷积

    Group Convolution 分组卷积GroupConvolution分组卷积最早见于AlexNet——2012年Imagenet的冠军方法,GroupConvolution被用来切分网络,使其在2个GPU上并行运行,AlexNet网络结构如下:ConvolutionVSGroupConvolution如果输入featuremap尺寸为C∗H∗W,卷积核有N个,输出featuremap与卷积核的数量相同也是N,每…

    2022年10月26日
  • 不管怎么选择,都会有遗憾「建议收藏」

    到底什么样的选择才是最好的,每一种选择都会有遗憾!最近有点想家,虽然在这个城市安了新家。那个小的城市–延安,和这个大的城市—长沙,两种感觉,不同的生活体验。现在都十一月了,要是在延安,那么现在已经是深秋,开始变得萧条,不想夏天那么生机盎然,而现在这个城市秋天和夏天在外观上看不出什么变化,只是现在的温度比夏天舒服了很多,不冷 不热。城市的车水马龙,霓虹灯,夜晚还是有很多的喧嚣,也看不到漫天的繁星。

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号