设计模式 一 工厂方法Factory Method(工厂模式)

原创 2012年03月29日 15:17:01
<?php
/**
 * 工厂方法模式演变
 *
 * 比萨加盟店
 * 背景:随着比萨店的发展,有更多人想成为比萨加盟店。
 */


/**
 * 每家加盟店都可能想要提供不同风味的比萨(比方说纽约、芝加哥、加州),这受到了开店地点影响。
 */


/**
 * 我们已经有一个做法。。。
 * 如果利用SimpleFactory,写出三种不同的工厂,分别为NYPizzaFactory、ChicagoPizzaFactory、CaliforniaPizzaFactory,那么各地加盟店都有适合的工厂可以使用,这是一种做法。
 */

$NYPizzaFactory = new NYPizzaFactory();
$nyStore = new PizzaStore($NYPizzaFactory);
$nyStore->orderPizza("veggie");


$ChicagoPizzaFactory = new NYPizzaFactory();
$chicagoStore = new PizzaStore($ChicagoPizzaFactory);
$chicagoStore->orderPizza("veggie");


/**
 * 但是你想要多一些质量控制。。。。
 * 在推广SimpleFactory时,你发现加盟店的确是采用你的工厂创建比萨,但其他部分,却开始采用他们自创的流程。
 * 烘烤的做法有些差异、不要切片、使用其他厂商的盒子。
 */


/**
 * 让子类决定,给比萨店使用框架。
 * 有个做法可以让比萨制作活动局限于pizzaStore类,而同时又能让这些加盟店依然可以自由制作该区域的风味。
 * 所有做的事情,就是把 createPizza() 设置为“抽象方法”,然后为每个区域风味创建一个PizzaStore 的子类。
 * 抽象、接口实现多态。
 */

 abstract class PizzaStore {
	//public $factory;
	//public function __construct(SimpleFactory $simpleFactory ) {
	//	$this->factory = $simpleFactory;
	//}
	
	public function orderPizza($type) {		
		//为了让系统有弹性,我们很希望这是一个抽象类或接口。
		//$pizza = $this->factory->createPizza($type); //变化部分
		$pizza = $this->createPizza($type);

		$pizza->prepare(); //准备
		$pizza->bake(); //烘烤
		$pizza->cut(); //切片
		$pizza->box(); //包装
		return $pizza;
	}

	abstract public function createPizza($type);
}

/**
 * 现在已经有了PizzaStore 超类,让 NYPizzaStore,ChicagoPizzaStore等 都继承这个PizzaStore,由子类决定如何制作比萨。
 *
 */

/**
 * 子类如何做决定
 * 关于这个方面,需要从PizzaStore的orderPizza()方法观点来看,更进一步地,orderPizza()方法对pizza做了许多事情(准备、烘烤、切片、包装)
 * 但由于Pizza对象是抽象的,orderPizza()并不知道哪些实际的具体类参与了进来,这不是orderPizza()方法决定的,换句话,这就是解耦。
 * 那么,子类是实时作出这样的决定吗?不是,但从orderPizza()的角度来看,如果选择在NYStylePizzaStore订购比萨,就是由这个子类(NYStylePizzaStore)决定。
 * 严格来说,并非由这个子类实际做“决定”,而是由“顾客”决定到哪一家风味比萨店才决定了比萨风味。
 */

class NYPizzaStore extends PizzaStore {
	public function createPizza($type) {
		if ("cheese" == $type) {//奶酪比萨
			$pizza = new NYStyleCheesePizza(); 		
		} elseif ("greek" == $type) {//希腊比萨
			$pizza = new NYStyleGreekPizza();		
		} elseif ("pepperoni" == $type) {//香肠比萨
			$pizza = new NYStylePepperoniPizza();		
		} else {
			return null;
		}
		return $pizza;
	}
}

$NYPizzaStore = new NYPizzaStore();
$pizza = $NYPizzaStore->orderPizza('cheese');

/**
 * 注意 orderPizza 已经实现了createPizza
 */




 /**
  * 总结 
  * 工厂方法模式 定义了一个创建对象的接口,但由子类决定要实例化的类时哪一个。工厂方法让类把实例化推迟到子类。
  * 问:简单工厂与工厂方法的差异
  * 答:工厂方法是用继承扩展了一个类,而简单工厂,工厂是另一个pizzastore使用对象。
  * 子类的确看起来像简单工厂。简单工厂把全部的事情,在一个地方处理完了。然而工厂方法却是创建一个框架,让子类决定要如何实现。
  * 比方说,在工厂方法中,orderPizza()方法提供了一般框架,以便创建比萨。orderPizza()依赖工厂方法创建具体类,并制造出实际的比萨。
  */






参考资料 :Head First 设计模式


日志记录实例演化


设计模式目录


相关文章推荐

JAVA 多线程静态同步函数的锁是class 对象

//仅作为学习笔记 /* 通过验证发现 同步函数如果被静态修饰后,不再以this 为锁 静态进内存时,内存中没有本类对象,但是一定有该类的字节码文件对象 类名.class 该对象的...

【设计模式】HeadFirst设计模式(四):工厂模式

设计模式要求我们不应该针对实现编程,为了降低耦合度,提高可维护性。当程序中出现“new”的时候,就证明程序在实例化一个具体类,所以用的是实现,而不是接口。如果代码绑着具体的类会导致代码更加脆弱,缺乏弹...

设计模式案例--工厂模式--工厂方法(factory method)

工厂方法(factory method) 工厂方法模式针对的是一个产品等级结构,下面是按照两种不同的等级结构思想来设计的 (1) 1、工厂类文件CarFactory.java package ...

2.3 《硬啃设计模式》 第5章 “妞”太多,如何管理?(2)- 工厂方法(Factory Method Pattern)

我在实际工作中还没有用过工厂方法,本文简单谈谈我的理解,供大家参考。这个图一下子不太好理解,我们先回顾一下简单工厂,简单工厂是通过一个方法来包装new对象的动作,如果我们将new对象的动作包装到一个类...

Java设计模式——工厂方法(Factory Method)

什么是工厂方法定义一个创建产品对象的工厂接口,让子类决定实例化哪一个类,将实际创建工作推迟到子类当中。它的核心结构有四个角色,分别是 【抽象工厂】Factory : 具体工厂类必须实现这个接口。在...

跟着Android学设计模式:工厂方法(Factory method)

阅读Android的优秀源码,能够提高自己的设计能力和

深入浅出设计模式 ------ Factory Method(工厂方法)

参考书籍: 《设计模式 : 可复用面向对象软件的基础》 《Effective Java》 《Head F...

设计模式之:工厂方法(Factory Method)

在简单工厂里,我们用简单工厂类来产生子类对象,但是如果我们现在要增加一个具体产品,那么我们就得修改简单工厂,这就违反了“对扩展开放”原则。...
  • szwang1
  • szwang1
  • 2013年08月08日 17:24
  • 673

设计模式------工厂方法(Factory Method)

定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法模式有四个要素:产品接口,产品实现,工厂接口,工厂实现。 以下是个典型工厂方法的例子 interface IProduct { ...

设计模式(4)——Factory method(工厂方法)

工厂方法的作用? 工厂方法又称为虚拟构造器,它定义了一个用于创建对象的接口,让子类决定实例化哪一个类。它的UML图如下:   上图中,Product定义了一个接口用于Factory创...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式 一 工厂方法Factory Method(工厂模式)
举报原因:
原因补充:

(最多只允许输入30个字)