意图:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
结构:
实例:还是以Pizza店为例,现在pizza需要进行需要不同的原料,例如添加cheese,sauce等原料,重新扩展的pizza为:
package headfirst.factory.pizzaaf; public abstract class Pizza { String name; Dough dough; Sauce sauce; Veggies veggies[]; Cheese cheese; Pepperoni pepperoni; Clams clam; abstract void prepare(); void bake() { System.out.println("Bake for 25 minutes at 350"); } void cut() { System.out.println("Cutting the pizza into diagonal slices"); } void box() { System.out.println("Place pizza in official PizzaStore box"); } void setName(String name) { this.name = name; } String getName() { return name; } public String toString() { StringBuffer result = new StringBuffer(); result.append("---- " + name + " ----\n"); if (dough != null) { result.append(dough); result.append("\n"); } if (sauce != null) { result.append(sauce); result.append("\n"); } if (cheese != null) { result.append(cheese); result.append("\n"); } if (veggies != null) { for (int i = 0; i < veggies.length; i++) { result.append(veggies[i]); if (i < veggies.length-1) { result.append(", "); } } result.append("\n"); } if (clam != null) { result.append(clam); result.append("\n"); } if (pepperoni != null) { result.append(pepperoni); result.append("\n"); } return result.toString(); } }
然后我们定义一个抽象工厂PizzaIngredientFactory:
package headfirst.factory.pizzaaf; public interface PizzaIngredientFactory { public Dough createDough(); public Sauce createSauce(); public Cheese createCheese(); public Veggies[] createVeggies(); public Pepperoni createPepperoni(); public Clams createClam(); }
继续我们假设有一个纽约的原料工厂,精于大蒜番茄酱料,Reggiano干酪,新鲜蛤蜊........
package headfirst.factory.pizzaaf; public class NYPizzaIngredientFactory implements PizzaIngredientFactory { public Dough createDough() { return new ThinCrustDough(); } public Sauce createSauce() { return new MarinaraSauce(); } public Cheese createCheese() { return new ReggianoCheese(); } public Veggies[] createVeggies() { Veggies veggies[] = { new Garlic(), new Onion(), new Mushroom(), new RedPepper() }; return veggies; } public Pepperoni createPepperoni() { return new SlicedPepperoni(); } public Clams createClam() { return new FreshClams(); } }
然后我们现在创建一个奶酪pizza
package headfirst.factory.pizzaaf; public class CheesePizza extends Pizza { PizzaIngredientFactory ingredientFactory; public CheesePizza(PizzaIngredientFactory ingredientFactory) { this.ingredientFactory = ingredientFactory; } void prepare() { System.out.println("Preparing " + name); dough = ingredientFactory.createDough(); sauce = ingredientFactory.createSauce(); cheese = ingredientFactory.createCheese(); } }
最后我们来看这个纽约的pizza店,怎么用纽约的原料工厂创建出具有纽约风味的cheese的pizza:
package headfirst.factory.pizzaaf; public class NYPizzaStore extends PizzaStore { protected Pizza createPizza(String item) { Pizza pizza = null; PizzaIngredientFactory ingredientFactory = new NYPizzaIngredientFactory(); if (item.equals("cheese")) { pizza = new CheesePizza(ingredientFactory); pizza.setName("New York Style Cheese Pizza"); } else if (item.equals("veggie")) { pizza = new VeggiePizza(ingredientFactory); pizza.setName("New York Style Veggie Pizza"); } else if (item.equals("clam")) { pizza = new ClamPizza(ingredientFactory); pizza.setName("New York Style Clam Pizza"); } else if (item.equals("pepperoni")) { pizza = new PepperoniPizza(ingredientFactory); pizza.setName("New York Style Pepperoni Pizza"); } return pizza; } }
最后我们来看最后的类图:
抽象工厂和工厂方法的一些联系:
1.工厂方法潜伏在抽象工厂模式之下,例如上面我们说的createDough(),createSource()方法,这些其实都在被继承的时候,然后来实现实例化的。
2.抽象工厂和工厂方法都是创建对象,工厂方法是“继承”(把对象的创建委托给子类,子类实现工厂方法来创建对象),抽象工厂通过对象的组合(对象的创建被实现在工厂接口暴露出来的方法中),抽象工厂产品家族和想让制造的相关的产品集合起来,而工厂方法可以让实例通过子类进行决定。
3.提醒我们随时要针对接口编程,而不是对实现编程。
缺点:
如果要增加相应的产品,相应的继承子类也要进行修改。繁琐。
发表评论
-
《Head.First设计模式》的学习笔记(17)-综合例子
2012-02-12 00:53 0例子: -
《Head.First设计模式》的学习笔记(16)--复合模式
2012-02-12 00:51 0意图: -
《Head.First设计模式》的学习笔记(15)--代理模式
2012-02-13 00:03 1164意图: 为另一个对象提供一个替身或占位符得以访问这个对象。 ... -
《Head.First设计模式》的学习笔记(14)--状态模式
2012-02-12 20:24 1244意图:允许对象在内部状态改变时改变她的行为,对象看起来好像修改 ... -
《Head.First设计模式》的学习笔记(13)--组合模式
2012-02-12 17:49 846先说一下题外话,这个模式是我学的最累的模式,代码纠结无比,而且 ... -
《Head.First设计模式》的学习笔记(12)--迭代器模式
2012-02-12 15:30 758意图:提供一种方法顺序访问一个聚合对象中的各个元素,而又不 ... -
《Head.First设计模式》的学习笔记(11)--模板方法模式
2012-02-12 00:46 884意图:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中 ... -
《Head.First设计模式》的学习笔记---前言
2012-02-11 23:36 0headfist系列博客从这篇--模版方法模式开始自己写的了, ... -
《Head.First设计模式》的学习笔记(10)--外观模式
2012-02-11 23:30 677意图:为子系统中的一组接口提供一个一致的界面,Facade ... -
《Head.First设计模式》的学习笔记(9)--适配器模式
2012-02-11 23:27 746软件开发中经常遇到的 ... -
《Head.First设计模式》的学习笔记(8)--命令模式
2012-02-11 22:55 741背景:有时候我们需要对方法进行封装,通过对这些封装的方法进行调 ... -
《Head.First设计模式》的学习笔记(7)--单件模式
2012-02-11 13:55 929背景:有一些对象其实我们只需要一个,比方说:线程池(threa ... -
《Head.First设计模式》的学习笔记(5)--工厂方法模式
2012-02-10 23:58 763意图:定义一个用于创建对象的接口,让子类决定实例化哪一 ... -
《Head.First设计模式》的学习笔记(4)--装饰者模式
2012-02-10 23:40 809意图:动态地将责任 ... -
《Head.First设计模式》的学习笔记(3)--观察者模式
2012-02-10 23:27 733意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改 ... -
《Head.First设计模式》的学习笔记(2)--策略模式
2012-02-10 23:09 634先对策略模式有一个总体认识。 意图:定义一系列的算法,把它们 ... -
《Head.First设计模式》的学习笔记(1)
2012-01-31 21:53 7891、慢一点,你理解的越 ...
相关推荐
Head.First.设计模式-中文版-带目录Head.First.设计模式-中文版-带目录Head.First.设计模式-中文版-带目录Head.First.设计模式-中文版-带目录Head.First.设计模式-中文版-带目录
### Head.First 设计模式学习笔记知识点总结 #### 一、设计模式概述 设计模式是一种用于解决软件设计中常见问题的标准化方法。通过采用设计模式,开发者可以提高代码的复用性、灵活性和可维护性。《Head First 设计...
《HeadFirst设计模式学习笔记1--策略模式Demo》 在软件工程中,设计模式是一种解决常见问题的标准方案,它提供了一种在特定情况下组织代码的模板。策略模式是设计模式中的一种行为模式,它允许在运行时选择算法或...
Head.First设计模式 Head.First设计模式Head.First设计模式 Head.First设计模式 Head.First设计模式
在“HeadFirst 设计模式学习笔记3--装饰模式 Demo”中,作者通过实例讲解了装饰模式的基本概念、结构和应用场景。这篇文章可能是从CSDN博客平台上的一个链接访问的,遗憾的是,由于我们当前无法直接访问该链接,所以...
《Head First设计模式》是一本深受开发者喜爱的...以上就是《Head First设计模式》中37-78章的主要知识点,通过学习这些模式,开发者可以更好地理解和应用软件设计原则,提升代码质量,构建更健壮、更易维护的系统。
强大的写作阵容。本书作者Eric Freeman;ElElisabeth Freeman是作家、讲师和技术顾问。Eric拥有耶鲁大学的计算机科学博士学位,E1isabath拥有耶鲁大学的计算机科学硕士学位。... Head.First设计模式.part10.rar
强大的写作阵容。本书作者Eric Freeman;ElElisabeth Freeman是作家、讲师和技术顾问。Eric拥有耶鲁大学的计算机科学博士学位,E1isabath拥有耶鲁大学的计算机科学硕士学位。... Head.First设计模式.part10.rar
强大的写作阵容。本书作者Eric Freeman;ElElisabeth Freeman是作家、讲师和技术顾问。Eric拥有耶鲁大学的计算机科学博士学位,E1isabath拥有耶鲁大学的计算机科学硕士学位。... Head.First设计模式.part10.rar
强大的写作阵容。本书作者Eric Freeman;ElElisabeth Freeman是作家、讲师和技术顾问。Eric拥有耶鲁大学的计算机科学博士学位,E1isabath拥有耶鲁大学的计算机科学硕士学位。... Head.First设计模式.part10.rar
强大的写作阵容。本书作者Eric Freeman;ElElisabeth Freeman是作家、讲师和技术顾问。Eric拥有耶鲁大学的计算机科学博士学位,E1isabath拥有耶鲁大学的计算机科学硕士学位。... Head.First设计模式.part10.rar
总的来说,HeadFirst设计模式的学习笔记2关于观察者模式的演示,旨在帮助开发者理解如何使用观察者模式来构建可扩展的系统。通过实际的代码示例,我们可以更深入地掌握这一模式,并将其应用到日常开发中,提升代码的...