设计模式 一 抽象工厂Abstract Factory(工厂模式)

原创 2012年03月30日 14:17:21
<?php
/**
 * 原料家族
 *
 * 随着比萨店加盟店越来越多,有些加盟店为了提高利润,从而降低了原料的质量,所有总店必须采取一些措施,避免损害公司形象的品牌。
 */

/**
 * 措施:保持原料一致
 * 问题1:如何确保原料一致,打算建造一家生产原料的工厂,并送到各家加盟店。
 * 问题2:各个加盟店坐落在不同的区域,纽约的红酱料和芝加哥的红酱料是不一样的。
 * 所有让我们准备二组不同的原料。
 *
 */


 /**
  * 开始建造原料工厂
  * 现在,我们要建造一个工厂来生产原料;这个工厂将负责创建原料家族中的每一种原料。也就是说,工厂将要生产面团、酱料、芝士等
  * 待会儿,你就知道如何处理各个区域的差异了。
  */


/**
 * 先开始定义一个接口,这个接口负责创建所有的原料。
 *
 */

interface IPizzaIngredientFactory {
	public function createDough();
	public function createSauce();
	public function createCheese();
	public function createVeggies();
	public function createPepperoni();
	public function createClam();
}

/**
 * 接下来要做的事情。
 * 1、为每一个区域建造一个工厂。你需要创建一个继承自IPizzaIngredientFactory 的子类来实现每一个创建方法。
 * 2、实现一组原料类提供工厂使用,例如ReggianoCheese(巴马干酪)、RedPeppers(红辣椒)、ThickCrustDough(厚面团),这些类可以在合适的区域间共享。
 * 3、然后你仍然需要将这一切组织起来,将新的原料工厂整合进旧的 PizzaStore(NYPizzaStore、ChicagoPizzaStore)代码中。
 */


 /**
  * 创建纽约原料工厂
  */
class NYPizzaIngredientFactory implements IPizzaIngredientFactory {
	public function createDough() {
		return new ThickCrustDough();
	}

	public function createSauce() {
		return new MarinaraSauce();
	}

	public function createCheese() {
		return new ReggianoCheese();
	}

	// 其他省略
}

/**
 * 创建芝加哥原料工厂
 */
class ChicagoPizzaIngredientFactory implements IPizzaIngredientFactory {
	public function createDough() {
		return new ThickCrustDough();
	}
	
	public function createSauce() {
		return new PlumTomatoSauce();
	}

	// 其他省略
}

/**
 * 重做比萨
 *
 * 原料工厂已经一切就绪,现在我们只需要重做比萨,好让它们只使用原料工厂生产出来的原料。我们先从抽象的Pizza类开始。
 */

 abstract class Pizza {
	public $name;
	public $price;
	public $dough;
	public $sauce;
	//省略其他原料成员。

	abstract public function prepare(); //主要抽象这个前期收集原料

	public function bake() {
		echo "baking";
	}

	public function cut() {
		echo "cutting";
	}

	// 其他操作省略
 }


/**
 * 继续重做比萨
 * 现在已经有了一个抽象比萨,可以开始创建纽约和芝加哥风味的比萨了。从今以后,加盟店必需直接从工厂取得原料,那些偷工减料的日子宣告结束了!
 * 我们曾经写过工厂方法的代码, 有NYCheesePizza 和 ChicagoCheesePizza类。比较下这两个类,唯一的差异在于使用区域性的原料,至于比萨做法都是一样的,
 * 它们都依循相同的准备步骤,只是使用不同的原料。
 * 所以,其实我们不需要设计两个不同的类来出来不同风味的比萨,让原料工厂处理这种差异就可以了。下面是CheesePizza。
 */

//奶酪比萨
class CheesePizza extends Pizza {
	public $ingredientFactory;
	public $dough;
	public $sauce;
	public $cheese;


	public function __construct(IPizzaIngredientFactory $ingredientFactory) {
		$this->ingredientFactory = $ingredientFactory;
	}

	public function prepare() {
		$this->dough = $this->ingredientFactory->createDough();
		$this->sauce = $this->ingredientFactory->createSauce();
		$this->cheese = $this->ingredientFactory->createCheese();
	}
}


//蛤蜊比萨
class ClamPizza extends Pizza {
	public $ingredientFactory;
	public $dough;
	public $sauce;
	public $cheese;
	public $clam;

	public function __construct(IPizzaIngredientFactory $ingredientFactory) {
		$this->ingredientFactory = $ingredientFactory;
	}

	public function prepare() {
		$this->dough = $this->ingredientFactory->createDough();
		$this->sauce = $this->ingredientFactory->createSauce();
		$this->cheese = $this->ingredientFactory->createCheese();
		$this->clam = $this->ingredientFactory->createCheese();
	}
}


/**
 * 再回到比萨店。
 *
 */

 
class NYPizzaStore extends PizzaStore {
	public function createPizza($type) {

		$ingredientFactory = new NYPizzaIngredientFactory();

		if ("cheese" == $type) {//奶酪比萨
			//$pizza = new NYStyleCheesePizza();
			$pizza = new CheesePizza($ingredientFactory);
		} elseif ("greek" == $type) {//希腊比萨
			//$pizza = new NYStyleGreekPizza();		
			$pizza = new GreekPizza($ingredientFactory);
		} elseif ("pepperoni" == $type) {//香肠比萨
			//$pizza = new NYStylePepperoniPizza();		
			$pizza = new PepperoniPizza($ingredientFactory);
		} else {
			return null;
		}
		return $pizza;
	}
}




/**
 * 总结
 * 抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确具体类。
 *
 */




参考资料 :Head First 设计模式

参考其他 http://blog.csdn.net/calllmq/article/details/7335951


设计模式目录

Java设计模式——抽象工厂(Abstract Factory)以及工厂模式总结

抽象工厂和工厂方法的区别 工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个抽象产品类。 工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个具体产品类。(与上面呼...

设计模式(一) 抽象工厂(Abstract Factory)

1.定义 抽象工厂是一种常用的对象创建型设计模式。抽象工厂模式提供了一种方式,可以将一组具有统一主题的单独工厂封装起来,它提供一个创建一系列相关或相互依赖对象的接口,而无需制定它们具体的类。 2.结构...

【设计模式】之抽象工厂(Abstract Factory)

抽象工厂的定义为:不需要指定具体的类,为创建一系列有关联或有依赖关系的对象提供一个接口(Provide an interface for creating families of related or...
  • FeeLang
  • FeeLang
  • 2012年07月18日 11:22
  • 988

设计模式学习总结:抽象工厂(Abstract Factory)

意图提供一个创建一系列相关或者相互依赖对象的接口,而无需指定它们具体的类。适用性 一个系统要独立于它的产品的创建、组合和表示时。 一个系统要由多个产品系列中的一个来配置时。 当你要强调一系列相关的产品...

设计模式:(2)抽象工厂(Abstract Factory)

在分享抽象工厂模式前,我想还是将设计模式的分类图贴上,以便查看整体分布情况,防止思路混乱。 从设计模式分类图中可以看到抽象工厂模式是经典的创建型设计模式之一。也可以看到抽象工厂模式是对象型创...

深入浅出设计模式 ------ Abstract Factory(抽象工厂)

本文可以和笔者的深入浅出设计模式 ------ Factory Method(工厂方法)参照着看, 可以区分这三个工厂模式的不同。...

设计模式读书笔记:Abstract Factory(抽象工厂)

意图: 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。...

iOS 21种设计模式之抽象工厂(Abstract Factory)

原创Blog,转载请注明出处 http://blog.csdn.net/hello_hwc?viewmode=list 我的stackoverflow感谢感谢《Pro Objective-C ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式 一 抽象工厂Abstract Factory(工厂模式)
举报原因:
原因补充:

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