ITPub博客

首页 > 应用开发 > Java > 简单工厂---学习笔记

简单工厂---学习笔记

Java 作者:方文才 时间:2014-10-24 14:57:04 0 删除 编辑
假设你开个汉堡店。
    你写了一个汉堡基类 -- 因为有辣鸡翅汉堡、有甜圈汉堡、有咸鱼汉堡等等。
    完成一个汉堡,有原材料准备prepare、烘烤bake、以及包装package等过程。所有的汉堡制作都要经历这个过程。这些方法在基类中声明。所有的汉堡类都继承并Override这些方法。

    现在你要写一个订购汉堡的函数,如果有客户要订购汉堡,调这个订购函数就可以了。问题是有各种各样的汉堡。于是,根据汉堡的类型,你需要new不同的汉 堡。但是,除了new之外所有的代码都是一样的:原料准备,烘烤,包装。只要知道是什么类型的汉堡,那种类型的汉堡就知道怎么完成整个过程(嗯,虚函 数)。
  1. void order_hamburger(string& HB_type)
  2. {
  3.     Hamburger* hb;
  4.     if (HB_type == 辣鸡) {
  5.         hb = new 辣鸡汉堡;
  6.     } else if (HB_type == 咸鱼) {
  7.         hb = new 咸鱼汉堡;
  8.     } else if () {
  9.         ...
  10.     }

  11.     hb->prepare();
  12.     hb->bake();
  13.     hb->package();  
  14. }
复制代码
你 写了一大堆if else。这可不好,一旦汉堡的种类有变化,你就得重新维护order_hamburger方法。不止order_hamburger,还有类似于 order_hamburger这种根据类型来判断new什么对象的方法 -- 你都需要重写。可能复制粘贴是个好办法...

    稍微好一点的,就是写一个工厂类,里面放一个工厂方法:
  1. class HBFactory {
  2.   Hamburger* createHB(string& HB_type)
  3.   {
  4.       Hamburger* hb;
  5.       if (HB_type == 辣鸡) {
  6.          hb = new xxx;
  7.       } else if ( ) {
  8.          ...
  9.       }
  10.          ...
  11.       return hb;
  12.   }
  13. };
复制代码
这样,order_hamberger就可以这样写了:
  1. order_hamburger(string& HB_type)
  2. {
  3.     HBFactory HBfactory;
  4.     Hamburger* hb = HBfactory.createHB(HB_type);

  5.     hb->prepare();
  6.     hb->bake();
  7.     hb->package();  
  8. }
复制代码
order_hamburger方法永远不需要变动。一旦有改变,改变那个Factory就可以了。

    你说,这不过是把if-else移到HBFactory里面而已。没错,只是类似于order_hamburger的方法都可以使用这个工厂,所以避免了代码重复。所有的if-else变化,都统一放到这个工厂类的工厂方法里了。
    这使得,代码可能变化的部分被独立出来。独立到这个工厂类中了。设计模式中所谓“封装变化”,就是指将变化的部分独立出来,这样一旦有变化发生,改动一处就可以了,而不是处处复制粘贴,一旦疏忽就出错。

    嗯,上面的就是简单工厂类了(不是GOF收录的设计模式,只是常用而已)。工厂方法模式,就是在基类中定义一个工厂方法,所有的继承类都重写这个工厂方法,由子类来决定究竟实例化哪一个。抽象工厂模式,则可以创建交叉的产品族。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/28140453/viewspace-1308869/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2014-10-24

  • 博文量
    1
  • 访问量
    940