设计模式 一 抽象工厂Abstract Factory(工厂模式)
2012-03-30 14:17
281 查看
<?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 设计模式
参考其他 /article/9674673.html
设计模式目录
相关文章推荐
- 设计模式——简单工厂、工厂方法、抽象工厂
- 设计模式之--工厂方法和抽象工厂
- 【设计模式】静态工厂、工厂方法和抽象工厂的联系与区别
- 结合项目实例 回顾传统设计模式(四)工厂模式(简单工厂、普通工厂、抽象工厂)
- 设计模式:浅析 抽象工厂、工厂方法、简单(静态)工厂 java实现
- Java设计模式之-----工厂模式(简单工厂,抽象工厂)
- 《GOF设计模式》—抽象工厂(Abstract Factory)—Delphi源码示例:基于类的工厂
- 设计模式--工厂模式(工厂方法、抽象工厂)
- Java设计模式之简单工厂、工厂方法和抽象工厂
- 设计模式--简单工厂、工厂方法、抽象工厂方法
- 软件爱 设计模式--工厂模式(简单工厂,工厂方法,抽象工厂)
- SSH中用到的设计模式之三——工厂方法和抽象工厂
- 设计模式——简单工厂,工厂方法,抽象工厂
- Java设计模式之简单工厂、工厂方法和抽象工厂
- 每周一个设计模式之工厂方法与抽象工厂
- Java设计模式——工厂方法和抽象工厂方法
- 设计模式-工厂模式(简单工厂,工厂方法,抽象工厂)
- head first 设计模式学习之 简单工厂,工厂方法和抽象工厂
- 设计模式之三种工厂模式总结(简单工厂、工厂方法、抽象工厂)
- C++设计模式之一 工厂模式(简单工厂、工厂和抽象工厂)