在http://quicker.iteye.com/blog/571714一文中已经讲了简单工厂和工厂方法并且有UML图和实现的代码。

这里只结合实例分析一下工厂方法在实际生活中的应用。

我们看看比萨店及比萨的图。

产品图。

结合http://quicker.iteye.com/blog/571714中关于工厂方法模式的实现,不难得出实现代码:

package com.lwf.disign.learn.factorymethod;public abstract class PizzaStore {public final Pizza orderPizza(String type){Pizza pizza;pizza = createPizza(type);pizza.prepare();pizza.bake();pizza.cut();pizza.box();return pizza;}abstract Pizza createPizza(String type);
}
package com.lwf.disign.learn.factorymethod;public class NYPizzaStore extends PizzaStore {Pizza createPizza(String type) {Pizza pizza = null;if(type.equals("cheese")){pizza = new NYCheesePizza();}else if(type.equals("veggle")){pizza = new NYVegglePizza();}return pizza;}}
package com.lwf.disign.learn.factorymethod;public class ChicagoPizzaStore extends PizzaStore {Pizza createPizza(String type) {Pizza pizza = null;if(type.equals("cheese")){pizza = new ChicagoCheesePizza();}else if(type.equals("veggle")){pizza = new ChicagoVegglePizza();}return pizza;}}
package com.lwf.disign.learn.factorymethod;import java.util.ArrayList;public abstract class Pizza {String name;  //名称String dough;   //面团类型String sauce; //酱料类型ArrayList toppings = new ArrayList(); //一套佐料public void prepare() {System.out.println("Preparing " + name);System.out.println("Tossign dough..." + dough);System.out.println("Adding sauce..." + sauce);System.out.println("Adding toppings: ");for (int i = 0; i < toppings.size(); i++) {System.out.println(" " + toppings.get(i));}}public void bake() {System.out.println("Bake for 25 minutes at 350");}public void cut() {System.out.println("Cutting the pizza into diagonal slices");}public void box() {System.out.println("Pizza in offical PizzaStrore box");}public String getName(){return name;}
}
package com.lwf.disign.learn.factorymethod;public class NYCheesePizza extends Pizza {public NYCheesePizza(){name = "NYCheesePizza";dough = "Thin crust dough NYCheesePizza";sauce = "Marina sauce NYCheesePizza";toppings.add("Grated NYCheesePizza cheese");}public void cut(){System.out.println("cut it into NYCheesePizza slices");}
}
package com.lwf.disign.learn.factorymethod;public class NYVegglePizza extends Pizza {public NYVegglePizza(){name = "NYVegglePizza";dough = "Thin crust dough NYVegglePizza";sauce = "Marina sauce NYVegglePizza";toppings.add("Grated NYVegglePizza cheese");}public void cut(){System.out.println("cut it into NYVegglePizza slices");}
}
package com.lwf.disign.learn.factorymethod;public class ChicagoCheesePizza extends Pizza {public ChicagoCheesePizza(){name = "ChicagoCheesePizza";dough = "Thin crust dough ChicagoCheesePizza";sauce = "Marina sauce ChicagoCheesePizza";toppings.add("Grated ChicagoCheesePizza cheese");}public void cut(){System.out.println("cut it into ChicagoCheesePizza slices");}
}
package com.lwf.disign.learn.factorymethod;public class ChicagoVegglePizza extends Pizza {public ChicagoVegglePizza(){name = "ChicagoVegglePizza";dough = "Thin crust dough ChicagoVegglePizza";sauce = "Marina sauce ChicagoVegglePizza";toppings.add("Grated ChicagoVegglePizza cheese");}public void cut(){System.out.println("cut it into ChicagoVegglePizza slices");}
}

上面共定义了四种比萨,客户向系统订购这四种比萨。。

package com.lwf.disign.learn.factorymethod;public class PizzaStoreTest {public static void main(String[] args) {PizzaStore pizzaStore = new NYPizzaStore();Pizza pizza = pizzaStore.orderPizza("cheese");print(pizza.getName());pizza = pizzaStore.orderPizza("veggle");print(pizza.getName());pizzaStore = new ChicagoPizzaStore();pizza = pizzaStore.orderPizza("cheese");print(pizza.getName());pizza = pizzaStore.orderPizza("veggle");print(pizza.getName());}public static void print(String name){System.out.println(name);System.out.println("-------------------------------------------------------------");}
}

输出结果为:

Preparing NYCheesePizza
Tossign dough...Thin crust dough NYCheesePizza
Adding sauce...Marina sauce NYCheesePizza
Adding toppings: Grated NYCheesePizza cheese
Bake for 25 minutes at 350
cut it into NYCheesePizza slices
Pizza in offical PizzaStrore box
NYCheesePizza
-------------------------------------------------------------
Preparing NYVegglePizza
Tossign dough...Thin crust dough NYVegglePizza
Adding sauce...Marina sauce NYVegglePizza
Adding toppings: Grated NYVegglePizza cheese
Bake for 25 minutes at 350
cut it into NYVegglePizza slices
Pizza in offical PizzaStrore box
NYVegglePizza
-------------------------------------------------------------
Preparing ChicagoCheesePizza
Tossign dough...Thin crust dough ChicagoCheesePizza
Adding sauce...Marina sauce ChicagoCheesePizza
Adding toppings: Grated ChicagoCheesePizza cheese
Bake for 25 minutes at 350
cut it into ChicagoCheesePizza slices
Pizza in offical PizzaStrore box
ChicagoCheesePizza
-------------------------------------------------------------
Preparing ChicagoVegglePizza
Tossign dough...Thin crust dough ChicagoVegglePizza
Adding sauce...Marina sauce ChicagoVegglePizza
Adding toppings: Grated ChicagoVegglePizza cheese
Bake for 25 minutes at 350
cut it into ChicagoVegglePizza slices
Pizza in offical PizzaStrore box
ChicagoVegglePizza
-------------------------------------------------------------

设计原则:要依赖抽象,不要依赖具体类,也叫依赖倒置原则

如下图:

可以看到上下都依赖于pizza这个抽象类..

 这启发我们思考方式的变化,我们也可以倒置思考方式:如一般你想开个比萨店先会想到要用什么做比萨,考虑一大堆原料等。。。最后才是比萨店。那么我们可以改变思考的方式,我们只需要把比萨先做一个抽象。那们上我们可以开比萨店,下我们可以制作多种类型的比萨。

下面有几种方式可以让我们尽可能的遵守倒置原则

然而上面的三点要求对待程序可谓是严格的。。当然如果一个类以后变化的机会很少,那么为什么不直接new出来呢。如String类。。所以这些都只是让我们的设计变得更好的方针,不能死套在程序上。

深入浅出设计模式四——比萨店生产比萨实现(工厂方法模式)相关推荐

  1. 设计模式:给你生产一个女朋友---工厂方法模式

    工厂方法模式 工厂方法模式是我们开发中使用最广泛的设计模式之一,不说无聊的定义,直接看例子 一.工厂方法模式的四大模块: 1.抽象工厂 --- 一个抽象类,有一个生产产品(女朋友)的抽象方法,由具体工 ...

  2. 初学 Java 设计模式(三):实战抽象工厂方法模式 「QQ 厘米秀装扮」

    一.抽象工厂方法模式介绍 1. 解决的问题 通过接口的选择,解决在系统产品存在多个产品族,而系统仅消费某一族的产品的问题. 2. 定义 抽象工厂模式是一个围绕超级工厂创建其他工厂的模式,即抽象工厂是一 ...

  3. 【设计模式实践笔记】第一节:工厂方法模式

    前言 工作有段时间了,一直没有把自己所知所想沉淀下来,想趁着重新学习设计模式的机会,记录一些自己的心得体会. 大学里也有学过设计模式,那会没有实际的项目经验,感触不是很深,工作以后跟人讨论设计模式,有 ...

  4. 【设计模式-手写源码-2】-工厂方法模式-基于魔兽争霸冰封王座

    1:主题拆解 ① 对比简单工厂,建立工厂方法(FactoryMethod) ②工厂方法的优缺点和应用 ③对修改关闭对扩展开放 ④面向切面编程 2:基本介绍 定义一个用于创建对象的接口,让子类决定实例化 ...

  5. 《大话设计模式》读书笔记-第8章 工厂方法模式

    1.工厂方法(Factory Method),定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法是一个类的实例化延迟到其子类. 2.工厂方法(Factory Method)结构图 3.工厂 ...

  6. Java设计模式之工厂方法模式与抽象工厂模式

    2019独角兽企业重金招聘Python工程师标准>>> 一.前期回顾 上一篇<Java设计模式之单例模式>详细介绍了单例模式,介绍了单例模式的使用场景,优缺点,同时也写了 ...

  7. 【设计模式学习】工厂方法模式

    cpp学习设计模式:工厂方法模式 在学习工厂方法模式之前,先回忆前面学的简单工厂模式: 简单工厂模式就是将对象的创建和逻辑的判断都交给了一个工厂类去做,这样做的优点是客户端不需要知道具体产品类的类名和 ...

  8. 设计模式之工厂模式(工厂方法模式、抽象工厂模式)

    工厂模式 所谓工厂,就是将零件组装成产品的地方. 建一个对象常常需要复杂的过程,所以不适合包含在一个复合对象中.创建对象可能会导致大量的重复代码,可能会需要复合对象访问不到的信息,也可能提供不了足够级 ...

  9. java/android 设计模式学习笔记(3)---工厂方法模式

    这篇来介绍一下工厂方法模式(Factory Method Pattern),在实际开发过程中我们都习惯于直接使用 new 关键字用来创建一个对象,可是有时候对象的创造需要一系列的步骤:你可能需要计算或 ...

最新文章

  1. 最新的全球编程语言,操作系统,web服务器等使用率分析报告
  2. 符合RESTful的接口规范
  3. 一张图解释Linux的目录结构
  4. 在EXCEL中如何将一列中的相同值的数据行找出来?
  5. RTX5 | 消息队列06 - (实战技巧)FDCAN接收中断ISR同步线程
  6. 数列求和 java_[代码展示]数列求和
  7. sql增删改查_面试速记之数据库增删改查|附思维导图
  8. 在SQL Server中使用sp_WhoIsActive监视活动
  9. exosip 和 pjsip 简介
  10. 苹果手机编辑word_苹果手机的安全性真的太好了,这样加密,重要文件不怕泄密啦...
  11. 树莓派 不稳定 ssh经常断 解决
  12. appium+python 多设备并行执行脚本【转】
  13. MBR磁盘分区见解笔记
  14. 计算机基础 软件系统与硬件系统
  15. 【整理】CRISPR-Cas9用于病毒性传染病防控的最新进展
  16. 堆叠沙漏网络(stacked hourglass network)
  17. 19款国产手机无一幸免:15分钟破解人脸识别,打印眼镜让刷脸形同虚设 ?
  18. ConvertUtil
  19. Struts验证框架与一些技巧
  20. 中文图书期刊数据库文献检索

热门文章

  1. java加载js_[Java教程]javascript如何动态加载js文件
  2. 烈风米兰与java费切罗_《美骑评测》第03期:烈风米兰 气动公路车 评测
  3. QQ音乐Android wear,LG W200智能手表入手,性价比极高的Android Wear
  4. oracle正则表达式匹配中文
  5. 习题7-6 统计大写辅音字母
  6. PHP对接企业微信API上传临时素材
  7. geant4 射线源定义_Geant4基础知识讲解.doc
  8. Everything搜索知识
  9. javaScript的Map数据类型
  10. HEF4051B 8通道模拟多路复用器/解复用器