设计模式——抽象工厂模式
来源:互联网 发布:网络词表妹是什么梗 编辑:程序博客网 时间:2024/05/16 06:40
5.
OO模式:抽象工厂模式——提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类
例子:披萨店不同地域的原料准备
public class ClamPizza extends Pizza {PizzaIngredientFactory ingredientFactory; public ClamPizza(PizzaIngredientFactory ingredientFactory) {this.ingredientFactory = ingredientFactory;} void prepare() {System.out.println("Preparing " + name);dough = ingredientFactory.createDough();sauce = ingredientFactory.createSauce();cheese = ingredientFactory.createCheese();clam = ingredientFactory.createClam();}}
public interface PizzaIngredientFactory { public Dough createDough();public Sauce createSauce();public Cheese createCheese();public Veggies[] createVeggies();public Pepperoni createPepperoni();public Clams createClam(); }
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();}}
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();}}
public class ClamPizza extends Pizza {PizzaIngredientFactory ingredientFactory; public ClamPizza(PizzaIngredientFactory ingredientFactory) {this.ingredientFactory = ingredientFactory;} void prepare() {System.out.println("Preparing " + name);dough = ingredientFactory.createDough();sauce = ingredientFactory.createSauce();cheese = ingredientFactory.createCheese();clam = ingredientFactory.createClam();}}
public abstract class PizzaStore { protected abstract Pizza createPizza(String item); public Pizza orderPizza(String type) {Pizza pizza = createPizza(type);System.out.println("--- Making a " + pizza.getName() + " ---");pizza.prepare();pizza.bake();pizza.cut();pizza.box();return pizza;}}
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;}}
以下是上述类的关系图:
比较工厂方法模式和抽象工厂模式:
这两个模式虽然都属于工厂模式,但有所不同。
工厂方法使用继承:把对象的创建委托给子类,子类实现工厂方法来创建对象。
抽象工厂使用对象组合:对象的创建被实现在工厂接口所暴露出来的方法中。(当需要创建产品家族和想让制造的相关产品集合起来时,此模式更适合)
阅读全文
0 0
- 设计模式——抽象工厂模式
- 设计模式——抽象工厂模式
- 设计模式——抽象工厂模式
- 设计模式——抽象工厂模式
- 设计模式——抽象工厂模式
- 设计模式——抽象工厂模式
- 设计模式——抽象工厂模式
- 设计模式——抽象工厂模式
- 设计模式——抽象工厂模式
- 设计模式——抽象工厂模式
- 设计模式——抽象工厂模式
- 设计模式——抽象工厂模式
- 设计模式——抽象工厂模式
- 设计模式——抽象工厂模式
- 设计模式——抽象工厂模式
- 设计模式——抽象工厂模式
- 设计模式——抽象工厂模式
- 设计模式——抽象工厂模式
- 将ado.Recordset对象变量中查询结果显示到MSHFlexGrid控件中出现错误解决办法
- HDU 2102 A计划DFS
- HTML+SSM + MySQL的简单登录(二)
- dubbo原理系列1-服务端暴露过程
- epoll详解
- 设计模式——抽象工厂模式
- GTK程序设计
- (十四)Android的消息机制Handler
- 调研tcp定时器
- CopyOnWriteArrayList学习笔记
- 自定义可拖拽评分进度条控件
- AJAX基础
- Eclipse使用问题—svn Could not create the view
- 汇编语言(1)基本概念