设计模式之创建型模式—— 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();

?>
时间: 2024-08-08 05:20:41

设计模式之创建型模式—— 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系统需要支持对数据库中的员工薪资进行导出,并且支持多种格式

NET设计模式 第二部分 创建型模式(4):工厂方法模式(Factory Method)

工厂方法模式(Factory Method) ——.NET设计模式系列之五 Terrylee,2004年1月2日 概述 在软件系统中,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口.如何应对这种变化?提供一种封装机制来隔离出“这个易变对象”的变化,从而保持系统中“其它依赖该对象的对象”不随着需求的改变而改变?这就是要说的Factory Method模式了. 意图 定义一个用户创建对象的接口,让子类决定实例化哪一个类.Facto

Java设计模式从精通到入门四 简单工厂方法模式

简单工厂方法模式 属于23中设计模式中创建型类型. 核心思想:工厂提供创建对象的接口,由子类决定实例化哪一个子类. 来源 ? 设计模式之禅中的例子,女娲造人,通过八卦炉来进行造人,没有烧熟的为白人,烧太熟的为黑人,刚好的为黄种人的例子进行程序展示 女娲作为client,八卦炉为工厂类,人类为具体实现类,有皮肤的区别. UML类图 图一 Factory: 工厂类的接口,根据类类型,提供只能创建Human子类,或者子孙类的方法. HumanFactory: 工厂类的具体实现,通过反射获取该对象. H

设计模式那点事读书笔记(1)----工厂方法模式

工厂方法模式: 定义一个创建产品对象的工厂接口,让子类决定实例化哪种实例对象,将实际创建实例对象的工作推迟到子类当中,核心工厂类不再负责具体产品创建. 解决什么问题: 当子类型可能会有很多,以后需要不断添加不同子类的实现. 当一个系统尚在框架设计阶段,还不知道将来需要实例化那些具体类时. 系统设计之初不需要具体对象的概念. UML: 代码结构: 代码: 定义抽象产品: package com.demo.factory.model; /** * 定义抽象商品 */ public abstract

设计模式学习总结:(7)工厂方法模式和抽象工厂模式

工厂方法模式应该算是很容易理解的模式,至少从书上看是这样一回事,但是真正深入去理解它一种存在意义却是不容易的(代码量不够-.-).从语法上看,无非就是把面向对象的多态特性封装到了内部工程类,实现运行时多态. 意图: 定义一个用于创建对象的接口,让子类决定实例化哪个类.Factory Method使一个类的实例化延迟到其子类. 结构图: 简单的代码: class AbProduct { public: virtual void sayName()=0; AbProduct(string name)

Java 设计模式之 简单工厂模式(静态工厂方法模式)

简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类(或者父接口). 简单工厂模式的  UML 图: (1)抽象(Product)产品角色:简单工厂模式所创建的所有对象的父类,注意,这里的父类可以是接口也可以是抽象类,它负责描述所有实例所共有的公共接口. (2)具体产品(Concrete Product)角色:简

工厂模式三部曲:工厂方法模式

前言 紧接着上一篇文章开始写,这是本系列中的第二篇文章了,这篇文章主要讲一下工厂方法模式.在最后一篇抽象工厂模式的文章中,将会对这三篇文章进行一次总结. 这篇文章中并没有给出反射机制实现的代码,主要是因为工厂方法模式就是为了解决简单工厂模式的一些缺点,然而使用了反射机制的简单工厂模式已经不具备这些缺点,所以就不需要这篇文章中讲的内容了.这篇文章主要还是单一从设计模式的角度来讲一下这个模式,带大家认识一下这个设计模式. 本人理解可能不够深刻,这一系列文章中存在的问题,欢迎大家提出,谢谢! 什么是工

大话涉及模式Python实现-工厂方法模式

工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延时到其子类. 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 __author__ = 'Andy' 5 6 """ 7 大话设计模式 8 设计模式--工厂方法模式 9 工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定实例化哪一