设计模式 一 工厂方法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 设计模式


日志记录实例演化


设计模式目录


设计模式(创建型)之简单工厂模式(Simple Factory Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN。因为CSDN也支持MarkDown语法了,牛逼啊!概述简单工厂模式(Simple Factory Pattern)又叫...
  • yanbober
  • yanbober
  • 2015年04月27日 16:35
  • 2731

Spring 通过工厂方法(Factory Method)来配置bean

Spring 通过工厂方法(Factory Method)来配置bean在Spring的世界中, 我们通常会利用bean config file 或者 annotation注解方式来配置bean.在第...
  • nvd11
  • nvd11
  • 2016年05月31日 00:26
  • 15660

工厂方法模式(Factory Method)-最易懂的设计模式解析

前言在上文提到的最易懂的设计模式系列解析:简单工厂模式,发现简单工厂模式存在一系列问题: 工厂类集中了所有实例(产品)的创建逻辑,一旦这个工厂不能正常工作,整个系统都会受到影响; 违背“开放 - 关闭...
  • carson_ho
  • carson_ho
  • 2016年08月28日 08:31
  • 2809

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

工厂方法(factory method) 工厂方法模式针对的是一个产品等级结构,下面是按照两种不同的等级结构思想来设计的 (1) 1、工厂类文件CarFactory.java package ...
  • jiujiedexiaoming
  • jiujiedexiaoming
  • 2014年11月09日 01:31
  • 255

设计模式学习笔记四:工厂方法(Factory Method)

设计模式学习笔记四:工厂方法(Factory Method)     1.概述     在软件系统中,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实现经常面临着...
  • AlbenXie
  • AlbenXie
  • 2017年08月09日 19:08
  • 128

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

参考书籍: 《设计模式 : 可复用面向对象软件的基础》 《Effective Java》 《Head F...
  • wenniuwuren
  • wenniuwuren
  • 2015年01月28日 15:46
  • 1399

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

设计模式(3)——工厂方法 Factory Method
  • leonliu06
  • leonliu06
  • 2017年11月04日 21:47
  • 93

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

阅读Android的优秀源码,能够提高自己的设计能力和
  • Sailingthink
  • Sailingthink
  • 2014年05月15日 15:52
  • 719

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

  • annkie
  • annkie
  • 2013年01月13日 21:40
  • 510

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

什么是工厂方法定义一个创建产品对象的工厂接口,让子类决定实例化哪一个类,将实际创建工作推迟到子类当中。它的核心结构有四个角色,分别是 【抽象工厂】Factory : 具体工厂类必须实现这个接口。在...
  • qian520ao
  • qian520ao
  • 2017年05月23日 22:29
  • 409
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式 一 工厂方法Factory Method(工厂模式)
举报原因:
原因补充:

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