标签:style blog http color java 使用 os strong
工厂模式有两种类型:工厂方法模式和抽象工厂模式
1 面食抽象类: 2 /** 3 * 声明为抽象方法,不能直接new,实例化交给工厂来做 4 * @author Apache_xiaochao 5 * 6 */ 7 public abstract class Noodle { 8 9 private String name; // 名称 10 private String dough; // 面团 11 private List<String> spices; // 调料 12 13 /** 14 * 准备食材 15 */ 16 public void prepare() { 17 System.out.println( 18 "正在准备食材,面食名称:" + this.getName() + 19 " 面团名称:" + this.getDough() + 20 " 调料:" + spices.toString()); 21 } 22 23 /** 24 * 烧水 25 */ 26 public void boilWater() { 27 System.out.println("正在烧水..."); 28 } 29 30 /** 31 * 煮面 32 */ 33 public void cook() { 34 System.out.println("正在煮面..."); 35 } 36 37 /** 38 * 装盘 39 */ 40 public void sabot() { 41 System.out.println("正在装盘..."); 42 } 43 //余下的get和set方法,省略... 44 }
1 面食店抽象类: 2 /** 3 * 面食店抽象类,所有的面食店都需要继承这个抽象类 4 * @author Apache_xiaochao 5 * 6 */ 7 public abstract class NoodleStore { 8 9 /** 10 * 根据用户需求制作相应的面食 11 * @param type 12 * @return 13 */ 14 public Noodle orderNoodle(String type){ 15 Noodle noodle = null; 16 if(type != null){ 17 noodle = createNoodle(type); 18 noodle.prepare(); 19 noodle.boilWater(); 20 noodle.cook(); 21 noodle.sabot(); 22 } 23 return noodle; 24 } 25 26 /** 27 * 工厂方法 ,将new全部集中到这个方法里面去,然后将new延迟到子类中实现 28 * @param type 29 * @return 30 */ 31 protected abstract Noodle createNoodle(String type); //这里是核心,工厂方法就在这 32 //上面定义了一个抽象的工厂方法,也可以不是抽象的,我们可以在这里定义一个默认的工厂。 33 //这里讲所有的new全部集中到工厂方法中进行管理,每个子类都可以在该方法中管理自己的对象 34 //这里采用的是“参数化工厂方法”,可以根据传递的参数而创建不同的对象,然而工厂常常只产生一种对象,因此不需要参数化 35 36 }
1 具体的面食店,以山西面食馆为例: 2 /** 3 * 山西面食馆 4 * 5 * @author Apache_xiaochao 6 * 7 */ 8 public class ShanXiNoodleStore extends NoodleStore { 9 10 @Override 11 protected Noodle createNoodle(String type) { 12 Noodle noodle = null; 13 if (type != null) { 14 if ("saozi".equalsIgnoreCase(type)) { 15 noodle = new SXSaoziNoodle(); 16 } else if ("liujian".equalsIgnoreCase(type)) { 17 noodle = new SXLiujianNoodle(); 18 } 19 } 20 return noodle; 21 } 22 23 } 24 在这个具体的面食店里面,我们使用了很多的new,这些new可以轻松被管理,如果以后这家店希望添加新的面食,或者减少不受欢迎的面食,改起来就方便很多。
1 抽象工厂接口: 2 /** 3 * 抽象工厂 4 * @author Apache_xiaochao 5 * 6 */ 7 public interface NoodleIngredientFactory { 8 9 public abstract Dough orderDough(); //提供面团 10 public abstract Shallot orderShallot(); //提供小葱 11 public abstract Chili orderChili(); //提供辣椒 12 public abstract Egg orderEgg(); //提供鸡蛋 13 14 } 15 抽象工厂中定义了各种各样食材的供应方法,这些都返回了相应的食材对象,肯定需要用到很多new关键字,这里我们用抽象工厂将它们封装起来。
1 具体工厂的实现(以东北食材供应工厂为例): 2 /** 3 * 东北原料工厂,这个工厂为东北全境的东北面食馆提供食材 4 * @author Apache_xiaochao 5 * 6 */ 7 public class DongBeiIngredientFactory implements NoodleIngredientFactory { 8 9 @Override 10 public Dough orderDough() { 11 Dough dough = new Dough(); 12 dough.setName("黑龙江优质小麦"); 13 return dough; 14 } 15 16 @Override 17 public Shallot orderShallot() { 18 Shallot shallot = new Shallot(); 19 shallot.setName("山东大葱"); 20 return shallot; 21 } 22 23 @Override 24 public Chili orderChili() { 25 Chili chili = new Chili(); 26 chili.setName("西北红辣椒"); 27 return chili; 28 } 29 30 @Override 31 public Egg orderEgg() { 32 Egg egg = new Egg(); 33 egg.setName("农家土鸡蛋"); 34 return egg; 35 } 36 37 }
1 具体面食馆的实现(以东北面食馆为例): 2 /** 3 * 东北面食馆 4 * 5 * @author Apache_xiaochao 6 * 7 */ 8 public class DongBeiNoodleStore extends NoodleStore { 9 10 private NoodleIngredientFactory nif; 11 12 //在构造方法中指定由哪个食材工厂来提供食材 13 public DongBeiNoodleStore() { 14 this.nif = new DongBeiIngredientFactory(); 15 } 16 17 @Override 18 protected Noodle createNoodle(String type) { 19 Noodle noodle = null; 20 if (type != null) { 21 if ("yangchun".endsWith(type)) { 22 noodle = new DBYangchunNoodle(nif); 23 } else if ("dawan".equalsIgnoreCase(type)) { 24 noodle = new DBDawanNoodle(nif); 25 } 26 } 27 return noodle; 28 } 29 30 }
如有错误,恳请读者指正!
标签:style blog http color java 使用 os strong
原文地址:http://www.cnblogs.com/xiaochao-cs-whu/p/3918337.html