抽象工厂模式
来源:互联网 发布:搬瓦工 不适合 建站 编辑:程序博客网 时间:2024/06/05 07:11
简单工厂将字符串判断交给了工厂
工厂方法模式不同的工厂创建了不同的产品
接着Pizza的例子,假设createPizza()只是得到了Pizza,交给客户之前这个pizza还需要做一些其他的工序,如撒点肉松、包装等(这里将这些操作统一叫做prepare())。而这些prepare在纽约店和在芝加哥店都是不一样的。那怎么办?抽象工厂代码如下:
首先是Pizza超类,可以看到拥有一个保护的 Pizza原料工厂和meat。通过集成,所有类型的Pizza都应该具有这两个属性
package Factory.AbstractFactory;/** * Created by sgzhang on 2015/8/12. */public abstract class Pizza { protected PizzaIngredientFactory ingredientFactory; protected Meat meat; public abstract void prepare(); public abstract void eat();}接着是各类Pizza
package Factory.AbstractFactory;/** * Created by sgzhang on 2015/8/13. */public class CheesePizza extends Pizza { public CheesePizza(PizzaIngredientFactory ingredientFactory1) { this.ingredientFactory=ingredientFactory1; } @Override public void prepare() { this.meat=ingredientFactory.createMeat(); } @Override public void eat() { System.out.println("Cheese use"+meat.name()); }}
package Factory.AbstractFactory;/** * Created by sgzhang on 2015/8/13. */public class GreekPizza extends Pizza{ public GreekPizza(PizzaIngredientFactory ingredientFactory1) { this.ingredientFactory=ingredientFactory1; } @Override public void prepare() { this.meat=ingredientFactory.createMeat(); } @Override public void eat() { System.out.println("Cheese use"+meat.name()); }}
package Factory.AbstractFactory;/** * Created by sgzhang on 2015/8/13. */public class HotPizza extends Pizza { public HotPizza(PizzaIngredientFactory ingredientFactory1) { this.ingredientFactory=ingredientFactory1; } @Override public void prepare() { this.meat=ingredientFactory.createMeat(); } @Override public void eat() { System.out.println("HotPizza use"+meat.name()); }}对比工厂方法模式,可以看到,这里没有为不同地方的同类型Pizza作区分。每个类型的Pizza的构造需要传递进去一个地方的原料工厂,prepare直接调用这个地域工厂的方法取得原料Meat。下面是Meat超类的定义,它只有一个活的名字的方法name()。
package Factory.AbstractFactory;/** * Created by sgzhang on 2015/8/13. */public abstract class Meat { abstract String name();}//芝加哥的肉
package Factory.AbstractFactory;/** * Created by sgzhang on 2015/8/13. */public class ChicagoMeat extends Meat { @Override String name() { return "ChicagoMeat"; }}//纽约的肉
package Factory.AbstractFactory;/** * Created by sgzhang on 2015/8/13. */public class NYMeat extends Meat { @Override String name() { return "NYMeat"; }}
然后是原料工厂超类
package Factory.AbstractFactory;/** * Created by sgzhang on 2015/8/13. */public interface PizzaIngredientFactory { Meat createMeat();}//芝加哥的原料工厂
package Factory.AbstractFactory;/** * Created by sgzhang on 2015/8/13. */public class ChicagoPizzaIngredientFactory implements PizzaIngredientFactory{ @Override public Meat createMeat() { return new ChicagoMeat(); }}//纽约的原料工厂
package Factory.AbstractFactory;/** * Created by sgzhang on 2015/8/13. */public class NYPizzaIngredientFactory implements PizzaIngredientFactory { @Override public Meat createMeat() { return new NYMeat(); }}
接着是PizzaStore超类
package Factory.AbstractFactory;/** * Created by sgzhang on 2015/8/12. */public abstract class PizzaStore { public Pizza orderPizza(String type){ Pizza pizza=createPizza(type); pizza.prepare(); return pizza; } protected abstract Pizza createPizza(String type);}//芝加哥PizzaStore
package Factory.AbstractFactory;/** * Created by sgzhang on 2015/8/12. */public class ChicagoPizzaStore extends PizzaStore { @Override public Pizza createPizza(String type) { Pizza pizza=null; if(type.equals("Cheese")){ pizza=new CheesePizza(new ChicagoPizzaIngredientFactory()); }else if(type.equals("Greek")){ pizza=new GreekPizza(new ChicagoPizzaIngredientFactory()); }else{ pizza=new HotPizza(new ChicagoPizzaIngredientFactory()); } return pizza; }}
package Factory.AbstractFactory;/** * Created by sgzhang on 2015/8/12. */public class NYPizzaStore extends PizzaStore { @Override public Pizza createPizza(String type) { Pizza pizza=null; if(type.equals("Cheese")){ pizza=new CheesePizza(new NYPizzaIngredientFactory()); }else if(type.equals("Greek")){ pizza=new GreekPizza(new NYPizzaIngredientFactory()); }else{ pizza=new HotPizza(new NYPizzaIngredientFactory()); } return pizza; }}
可以看到抽象工厂在工厂方法的基础上,将区域Pizza的不同也抽象掉了,没有了NYCheesePizza这样的东西,将不同地域Pizza转化成了不同地域的工厂。对于这个不同,由于Store就是按地域区分的,一次store可以明确的指导该新建哪里的原料工厂。这样材料的不同就对客户封闭了。
最后是主程序
package Factory.AbstractFactory;/** * Created by sgzhang on 2015/8/13. */public class AbstractRun { public static void main(String[] args){ PizzaStore pizzaStore1=new ChicagoPizzaStore(); Pizza pizza1=pizzaStore1.orderPizza("Cheese"); pizza1.eat(); System.out.println("++++++++++++++++++++++++++++++++++++++++"); PizzaStore pizzaStore2=new NYPizzaStore(); Pizza pizza2=pizzaStore2.orderPizza("Cheese"); pizza2.eat(); System.out.println("++++++++++++++++++++++++++++++++++++++++"); PizzaStore pizzaStore3=new ChicagoPizzaStore(); Pizza pizza3=pizzaStore3.orderPizza("Greek"); pizza3.eat(); System.out.println("++++++++++++++++++++++++++++++++++++++++"); PizzaStore pizzaStore4=new ChicagoPizzaStore(); Pizza pizza4=pizzaStore4.orderPizza("Hot"); pizza4.eat(); }}
0 0
- 工厂模式 -- 抽象工厂
- 工厂模式-抽象工厂
- 工厂模式-抽象工厂
- 工厂模式/抽象工厂模式
- 工厂模式&&抽象工厂模式
- 工厂模式---抽象工厂模式
- 工厂模式&抽象工厂模式
- 工厂模式,抽象工厂模式
- 【模式】抽象工厂模式
- 简单工厂、工厂模式、抽象工厂模式
- 简单工厂、工厂模式、抽象工厂模式
- 简单工厂&工厂模式&抽象工厂模式
- 工厂方法,抽象工厂模式
- 2,工厂模式--抽象工厂
- C#工厂模式-抽象工厂
- 工厂模式与抽象工厂
- 抽象工厂设计模式
- 抽象工厂模式
- HDU ACM 2006 求奇数的乘积
- HDU ACM 2007 平方和与立方和
- Java中的Error和Exceptiond的异同点
- PAT 1027. Colors in Mars (20)
- 文件访问权限中关于文件和目录的访问权限
- 抽象工厂模式
- ubuntu杀死含有指定字符串的的一系列进程
- Delphi 简体-繁体 转换函数
- linux 创建swap分区
- IOS UIWebView与JavaScript交互实现Web App
- JVM codecache 配置
- Android Studio Tips -- 布局预览
- 安卓设置自定义字体的解决方案
- 深度学习综述