设计模式之创建型模式—— 1.2 工厂方法模式

<?php

	/**
	 * 1.2 工厂方法模式
	 * 解决的问题:
	 * 	如何解决多个类实例化对象的问题。
	 * 
	 * 解决的方案:
	 * 	定义一个用于创建对象的接口,让子类决定
	 * 	实例化哪一个类。工厂方法使一个类的实例
	 * 	化延迟到其子类。
	 * 
	 * 该模式包含四种角色:
	 * 	1. 抽象产品角色(一个)
	 * 		职责:它是具体工厂角色所创建的对象
	 * 			  的父类。负责描述所有实例所共
	 * 			  有的公共接口。
	 * 	2. 具体产品角色
	 * 		职责:它是具体工厂角色所要创建的目
	 * 			  标。
	 * 	3. 抽象工厂角色
	 * 		职责:负责描述所有具体工厂所共有的
	 * 			  公共接口。
	 * 	4. 具体工厂角色
	 * 		职责:具体实现产品实例化的场所。
	 * 
	 * 优点:
	 * 		1. 与简单工厂模式相同
	 * 		2. 当添加新运算时,就不需要修改工厂
	 * 		   中的代码了,这就遵循了开闭原则,
	 * 		   
	 * 缺点:
	 * 		1. 同简单工厂模式
	 * 
	 * 使用场景:
	 * 		1. 当一个类不知道它所必须创建的对象
	 * 		   的类的时候。
	 * 		2. 当一个类希望由它的子类来指定它所
	 * 		   创建的对象的时候。
	 * 		3. 当类将创建对象的职责委托给多个帮
	 * 		   助子类中的某一个,并且你希望将哪
	 * 		   一个帮助子类是代理者这一信息局部
	 * 		   化的时候。
	 */

	//抽象产品角色
	abstract class Operation {

		public static $numA;
		public static $numB;

		abstract protected function getResult();

	}

	//具体产品角色
	/**
	* 加法子类
	*/
	class Add extends Operation {
		public function getResult(){
			// return parent::$numA + $this->numB;
			return parent::$numA + parent::$numB;
		}
	}
	/**
	* 减法子类
	*/
	class Minus extends Operation {
		public function getResult(){
			return parent::$numA - parent::$numB;
		}
	}

	/**
	* 乘法子类
	*/
	class Mul extends Operation {
		public function getResult(){
			return parent::$numA * parent::$numB;
		}
	}

	/**
	* 除法子类
	*/
	class Div extends Operation {
		public function getResult(){
			if(parent::$numB != 0){
				return parent::$numA / parent::$numB;
			}
		}
	}

	//工厂角色
	// 定义一个类专门用于实例化加减乘除四个类
	interface OperFactry{
		public function createObj();
	}

	//具体工厂角色
	class AddFactry implements OperFactry{
		public function createObj(){
			return new Add();
		}
	}

	class MinusFactry implements OperFactry{
		public function createObj(){
			return new Minus();
		}
	}
	class MulFactry implements OperFactry{
		public function createObj(){
			return new Mul();
		}
	}
	class DivFactry implements OperFactry{
		public function createObj(){
			return new Div();
		}
	}

//客户端

Operation::$numA=3;
Operation::$numB=3;
$factry=new AddFactry(); //此时若要更改为其他运
						 //算直接改此处即可
$obj=$factry->createObj();
echo $obj->getResult();

?>
时间: 02-16

设计模式之创建型模式—— 1.2 工厂方法模式的相关文章

设计模式(三) : 创建型模式--工厂方法模式

工厂方法模式区别与简单工厂模式主要在于,factory中对对象的实例化延迟到了子类的factory中, 这也是优于简单工厂的地方.下面看这个模式的类图(截自<java与模式>): 示意性代码: ? 1 2 3 4 5 6 7 package com.javadesignpattern.factorymethod; public interface Creator {          public Product fatcory(); } package com.javadesignpatte

《JAVA与模式》之工厂方法模式

在阎宏博士的<JAVA与模式>一书中开头是这样描述工厂方法模式的: 工厂方法模式是类的创建模式,又叫做虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymorphic Factory)模式. 工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中. 那么工厂方法模式是在什么场景下使用呢,下面就以本人的理解举例说明: 相信很多人都做过导入导出功能,就拿导出功能来说.有这么一个需求:XX系统需要支持对数据库中的员工薪资进行导出,并且支持多种格式

简单工厂模式(静态工厂方法模式)

以计算器程序为例:只需输入运算符号,程序就实例化出合适的对象.通过多态,返回父类的方式实现了计算器的结果. 1)静态工厂方法统一管理对象的创建. 静态工厂方法通过传入的参数判断决定创建哪一个产品的实例,封装了对象的创建,客户端只管消费,实现了对责任(模块)的分割. 2)静态工厂方法推迟了产品的实例化. 通过XML配置文件就能改变具体创建的产品实例,修改为其他的产品实例,代码不须重新编译. 简单工厂模式结构图 C++代码实例实现: 1 #include<iostream> 2 using nam

第4章 创建型模式—工厂方法模式(2)

2. 工厂方法模式 2.1工厂方法模式的定义 (1)定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂模式使一个类的实例化延迟到其子类 ①Product:定义了工厂方法创建对象的接口.也就是实际需要使用的产品对象的接口 ②ConcreteProduct:具体的Product接口的实现对象. ③Factory(Creator):定义了工厂方法的抽象类并返回一个产品对象. ④ConcreteCreator:具体的创建器对象,该类实现和覆盖了父工厂类声明的方法.返回一个具体的Product实例

设计模式3 创建型模型

设计模式3 创建型模型 目录: 简单工厂模式 工厂方法模式 抽象工厂模式 单例模式 简单工厂 模型 [email protected]:~$ cat main.cpp  //设计模式:简单工厂 模型 #include<iostream> using namespace std; class Fruit { public: Fruit(string kind) { this->kind = kind; if(kind == "apple") {} else if (ki

设计模式实战应用之五:工厂方法模式

工厂方法模式的定义        工厂方法模式的应用相当广泛. 工厂方法模式在 Java API 中的应用比比皆是:java.util.Collection 接口的 iterator 方法就是一个非常著名的工厂方法模式的演示样例:java.net.URLStreamHandlerFactory 的 createURLStreamHandler(String protocol)  也是工厂方法模式的一个非常经典的应用,URLStreamHandlerFactory 定义了一个用来创建 URLStr

设计模式:工厂方法模式(Factory Method)和抽象工厂模式(Abstact Factory)

?在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象. 在这些情况,新对象的建立就是一个 "过程",不仅是一个操作,像一部大机器中的一个齿轮传动. 分类 ?工厂模式主要是为创建对象提供过渡接口,以便将创建对象的

Java设计模式—工厂方法模式&amp;抽象工厂模式

工厂方法模式与抽象工厂模式都是设计模式中重要而且常见的模式.       工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 通用类图如下: 在工厂方法模式中,抽象产品类Product负责定义产品的共性,实现对事物最抽象的定义:Creator为抽象创建 类,也就是抽象工厂,具体如何创建产品类是由具体的实现工厂ConcreteCreator完成的. 工厂方法模式的扩展方式有很多种,下边是工厂方法模式一个比较实用的源代码: 抽象产品类: pub

JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)

在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象. 在这些情况,新对象的建立就是一个 "过程",不仅是一个操作,像一部大机器中的一个齿轮传动. 模式的问题:你如何能轻松方便地构造对象实例,而不必关心构造对象实