抽象工厂模式——Head First Design Patterns

来源:互联网 发布:地球之眼软件 编辑:程序博客网 时间:2024/05/17 04:22

定义:创建一组相似或者相互依赖的对象,但是创建方法不返回具体的类。

 

使用场景: 1)当需要创建多个系列的产品时,想要保证同一系列的产品在同一个工厂里面

 

类图:

 

代码样例:

public class ChicagoPizzaIngredientFactory implements PizzaIngredientFactory {public Dough createDough() {return new ThickCrustDough();}public Sauce createSauce() {return new PlumTomatoSauce();}public Cheese createCheese() {return new MozzarellaCheese();}public Veggies[] createVeggies() {Veggies veggies[] = { new BlackOlives(),                       new Spinach(),                       new Eggplant() };return veggies;}public Pepperoni createPepperoni() {return new SlicedPepperoni();}public Clams createClam() {return new FrozenClams();}}


 

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();}}


 

public class ChicagoPizzaStore extends PizzaStore {protected Pizza createPizza(String item) {Pizza pizza = null;PizzaIngredientFactory ingredientFactory =new ChicagoPizzaIngredientFactory();if (item.equals("cheese")) {pizza = new CheesePizza(ingredientFactory);pizza.setName("Chicago Style Cheese Pizza");} else if (item.equals("veggie")) {pizza = new VeggiePizza(ingredientFactory);pizza.setName("Chicago Style Veggie Pizza");} else if (item.equals("clam")) {pizza = new ClamPizza(ingredientFactory);pizza.setName("Chicago Style Clam Pizza");} else if (item.equals("pepperoni")) {pizza = new PepperoniPizza(ingredientFactory);pizza.setName("Chicago Style Pepperoni Pizza");}return pizza;}}


 

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();}}


 

 

优点:1)将一组功能相关的产品放在一个工厂里面

 

缺点:1)每加一种新方法都要改变

 

类似的设计模式:1)工厂方法模式;抽象工厂模式侧重于产生一系列产品组,而工厂方法模式侧重于产生一个产品组

 

配套的内功心法:1

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 怀孕9个月同床了怎么办 结婚两年了都没怀孕怎么办 怀孕快40周了没有生的迹象怎么办 生完小孩掉头发很厉害怎么办 我27岁欠50多万怎么办 8岁童牙齿摔松了怎么办 我的眉毛后半边很稀少怎么办 剑三95修为满了怎么办 21三体综合症临界高风险怎么办 率土之滨没地了怎么办 老公有外遇怎么办他还舍不得小三 11选5输了6万 怎么办 k宝密码忘了怎么办5次 k宝密码输错5次怎么办 上火了牙疼怎么办怎样快速止疼 身体不吸收营养胖不起来怎么办 突然牙疼怎么办教你立刻止疼 蛀牙疼怎么办教你立刻止疼 做了牙套的牙疼怎么办 牙疼怎么办教你立刻止疼 七个月宝宝便秘拉不出来怎么办 喝酒脸上起了很多小红疙瘩怎么办 我的脸又痒又红怎么办 脸又红又痒又烫怎么办 满脸痘痘怎么办全部都是红的 身上起大片扁疙瘩很痒怎么办 我急用钱借钱又借不到怎么办 小孩蛀牙牙疼怎么办教你立刻止疼 牙齿里面长了个小牙齿怎么办 2岁宝宝又吐又拉怎么办 u盘坏了怎么办没反应了 怀孕了不知道孩子是谁的怎么办 怀孕八个月耻骨疼的厉害怎么办 没感情了这段婚姻该怎么办 1岁半宝宝o型腿怎么办 4s店没按时交车怎么办 几天几夜睡不着觉没有睡意怎么办 辣的吃多了胃疼怎么办 喉咙痛怎么办有最好即简单好得快 减肥过后皮肤留下的肥胖纹怎么办 用了完美玛丽艳脸上长痘痘怎么办