zoukankan      html  css  js  c++  java
  • 设计模式之第11章-建造者模式(Java实现)

    设计模式之第11章-建造者模式(Java实现)

      “那个餐厅我也是醉了、、、”“怎么了?”“上菜顺序啊,竟然先上甜品,然后是冷饮,再然后才是菜什么的,无语死了。”“这个顺序也有人这么点的啊。不过很少就是了,正常来说如果是中餐的话,都是先凉菜再热菜,然后是汤,最后是一些甜品什么的。西餐呐,先有头盘,用来开胃的,然后是汤(感觉好怪的说),再然后是副菜、主菜、蔬菜类、甜品、饮料来着。然后法国嘛就是blablabla、、、”(作者已被众人拖走。“让我说完啊,就剩几个国家了~啊~~”)。咳咳,题归正转。你问我是谁?且看下面的自我介绍。

    建造者模式之自我介绍

      既然你诚心诚意的问了,那我就大发慈悲的告诉你,为了防止软件界被破坏,为了维护软件界的和平,建造者(PS:在GoF的中文译本里被翻译为生成器模式,当然为了 向我的启蒙书《大话设计模式》致敬,在此沿用里面的翻译,创建者~),我是穿梭在银河系的设计模式,白洞、白色的明天在等待着我,就是酱紫,瞄~我的英文定义是:Separate the construction of a complex object from its representation so that the same construction process can create different representations.我的中文定义是:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。其类图如下:

      

      基本情况就是这个样子了。每个类图所行驶的功能职责图上已经详细给出。

    建造者模式之自我分析

      该进行自我解剖了。哦不,是自我分析,鉴于前几个说自己没有缺点的模式的悲惨下场,我就不说没有缺点了,不过先说下优点:

    • 将构造代码和表示代码分开。
    • 可以对构造过程进行更精细的控制。
    • 可以改变一个产品的内部表示。这个主要是因为Builder对象提供给指挥器一个构造产品的抽象接口。该接口可以使生成器隐藏这个产品的表示和内部结构。

    建造模式之实现

      刚刚把鱼哥给拖走了,为了表示歉意,在此就送身为吃货的鱼哥一堆吃的聊表歉意(某鱼:阿嚏,谁又想我了)。恩,就以上菜顺序来说吧。首先是FoodBuilder,用于将上菜顺序组装好。

      首先是上菜顺序的抽象类:

     1 public abstract class FoodSeq{
     2     //各个基本方法的执行顺序
     3     private ArrayList<String> seq = new ArrayList<>();
     4 
     5     //上菜
     6     protected abstract void food();
     7     //上汤
     8     protected abstract void soup();
     9     //上酒
    10     protected abstract void wine();
    11 
    12     final public void eat(){
    13         //循环,哪个先  吃哪个
    14         for ( int i =0; i<this.seq.size(); i++ ) {
    15             String s = this.seq.get(i);
    16             if (s.equalsIgnoreCase("food")) {
    17                 this.food();
    18             }
    19             else if (s.equalsIgnoreCase("soup")) {
    20                 this.soup();
    21             }
    22             else if (s.equalsIgnoreCase("wine")) {
    23                 this.wine();
    24             }
    25         }
    26     }
    27 
    28     //获取顺序值
    29     final public void setSequence(ArrayList<String> seq){
    30         this.seq =seq;
    31     }
    32 }
    View Code

      其次是中国菜的上菜顺序代码:

     1 public class ChSeq extends FoodSeq{
     2     //上菜
     3     protected abstract void food(){
     4         System.out.println("翠花,上酸菜,哦不,上菜~");
     5     }
     6     //上汤
     7     protected abstract void soup(){
     8         System.out.println("小二,上汤了");
     9     }
    10     //上酒
    11     protected abstract void wine(){
    12         System.out.println("老板,来瓶唐宋元明清年间的陈酿");
    13     }
    14 }
    View Code

      下面是FoodBuilder的抽象类:

    1 public abstract class FoodBuilder{
    2     //建造一个模型,给一个上菜顺序
    3     public abstract void setSequence(ArrayList<String> sequence);
    4     //设置完毕后可以直接得到上菜的顺序图
    5     public abstract FoodSeq getFoodSeq();
    6 }

      下面是中国菜系的Builder类实现类:

    1 public class ChBuilder extends FoodBuilder{
    2     private ChSeq ch = new ChSeq();
    3     public ChSeq getChSeq(){
    4         return this.ch;
    5     }
    6     public void setSequence(ArrayList<String> sequence){
    7         this.ch.setSequence(sequence);
    8     }
    9 }

      接下来就是我们最最重要的指挥官了,他可是运筹于帷幄之中,决胜于千里之外的顶级指挥官,指挥官中的战斗机,哦嘴滑了,战斗官:

     1 public class Director{
     2     private ArrayList<String> seq = new ArrayList();
     3     private chBuilder ch = new chBuilder();
     4 
     5     //顺序A,先上汤,后上菜,最后上酒
     6     public ChSeq getASeq(){
     7         //清除缓存
     8         this.seq.clear();
     9         //顺序A
    10         this.seq.add("soup");
    11         this.seq.add("food");
    12         this.seq.add("wine");
    13         this.ch.setSequence(this.seq);
    14         return (ChSeq)this.ch.getChSeq();
    15     }
    16 
    17         //顺序B,先上菜,再上酒,最后上汤
    18     public ChSeq getASeq(){
    19         //清除缓存
    20         this.seq.clear();
    21         //顺序A
    22         this.seq.add("food");
    23         this.seq.add("wine");
    24         this.seq.add("soup");
    25         this.ch.setSequence(this.seq);
    26         return (ChSeq)this.ch.getChSeq();
    27     }
    28 }
    View Code

      好了,具体实现到此就完了。

    建造者模式之应用场景

    • 有相同的方法但是执行顺序不同,产生不同的事件结构。
    • 多个部件或零件,都可以装配到一个对象中。
    • 产品类非常复杂或者产品类中的调用顺序不同的效能。

      预知后事如何,且听下回分解,饿的不行了,吃饭去~

     

     

        PS:本博客欢迎转发,但请注明博客地址及作者~

       博客地址:http://www.cnblogs.com/voidy/

       博客新址:http://voidy.net

       <。)#)))≦

     

  • 相关阅读:
    [BUUCTF]PWN14——not_the_same_3dsctf_2016
    flask cookie
    关于cookie和session
    mysql修改表操作
    MySQL 增删改查
    mysql数据类型
    python读写mysql
    聚合查询
    条件查询
    排序
  • 原文地址:https://www.cnblogs.com/voidy/p/4245660.html
Copyright © 2011-2022 走看看