鱼C论坛

 找回密码
 立即注册
查看: 1975|回复: 0

java设计模式之建造者模式

[复制链接]
发表于 2015-1-23 18:10:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
建造者模式是将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。 [构建与表示分离,同构建不同表示]
    与抽象工厂的区别:在建造者模式里,有个指导者,由指导者来管理建造者,用户是与指导者联系的,指导者联系建造者最后得到产品。即建造模式可以强制实行一种分步骤进行的建造过程。
  建造模式是将复杂的内部创建封装在内部,对于外部调用的人来说,只需要传入建造者和建造工具,对于内部是如何建造成成品的,调用者无需关心。
如图所示:
2015-01-23 17:39:17 的屏幕截图.png
需要说明一下几个类的作用:
Client: 相当于用户,它需要什么我们就给他什么,至于怎么实现,这个用户就不用去关心啦
CarModel以及两个实现类BenzModel和BMWModel叫做产品类,这个产品类实现了模板方法模式,也就是有模板方法
CarBuilder以及两个实现类BenzBuilder和BMWBuilder叫做建造者,负责建造Benz和BMW 车模,按照指定的顺序
Director类叫做导演类,负责安排已有模块的顺序,然后告诉Builder开始建造 ;

恩~~ 以下就是程序的具体实现:
首先从模型开始吧!来一个模型的抽象类CarModel.java:
  1. import java.util.*;

  2. public abstract class CarModel
  3. {
  4.   //这个参数是各个基本方法执行的顺序
  5.   private ArrayList<String> sequence = new ArrayList<String>();

  6.   //启动
  7.   protected abstract void start();
  8.   //停止
  9.   protected abstract void stop();
  10.   //喇叭的叫
  11.   protected abstract void alarm();
  12.   //引擎的响
  13.   protected abstract void engineBoom();

  14.   //跑起来
  15.   final public void run()
  16.   {
  17.      //循环一遍,谁在前,就先执行谁
  18.      for(int i=0; i<this.sequence.size(); i++)
  19.      {
  20.         String actionName = this.sequence.get(i);

  21.         if(actionName.equalsIgnoreCase("start"))
  22.         {
  23.            this.start();
  24.         }else if(actionName.equalsIgnoreCase("stop"))
  25.         {
  26.            this.stop();
  27.         }else if(actionName.equalsIgnoreCase("alarm"))
  28.         {
  29.            this.alarm();
  30.         }else if(actionName.equalsIgnoreCase("engine boom"))
  31.         {
  32.            this.engineBoom();
  33.         }
  34.      }
  35.   }
  36.   //把传递过来的值传递到类内
  37.    final public void setSequence(ArrayList<String> sequence)
  38.    {
  39.       this.sequence = sequence;
  40.    }
  41. }
复制代码
然后就是两个实现类BenzModel与BMWBuilder
  1. public class BenzModel extends CarModel
  2. {
  3.    protected void alarm()
  4.    {
  5.       System.out.println("奔驰车的喇叭声音是这个样子的...");
  6.    }
  7.    protected void engineBoom()
  8.    {
  9.        System.out.println("奔驰的引擎是这个声音...");
  10.    }
  11.    protected void start()
  12.    {
  13.       System.out.println("奔驰车跑起来啦...");
  14.    }
  15.    protected void stop()
  16.    {
  17.       System.out.println("奔驰车停下来啦...");
  18.    }

  19. }
复制代码
  1. public class BMWModel extends CarModel
  2. {
  3.    protected void alarm()
  4.    {
  5.       System.out.println("宝马车的喇叭声音是这个样子的...");
  6.    }
  7.    protected void engineBoom()
  8.    {
  9.       System.out.println("宝马车的引擎是这个声音...");
  10.    }
  11.    protected void start()
  12.    {
  13.       System.out.println("宝马车跑起来啦...");
  14.    }
  15.    protected void stop()
  16.    {
  17.       System.out.println("宝马车停下来啦...");
  18.    }

  19. }
复制代码

然后就是建造者的抽象类来获得模型:
  1. import java.util.ArrayList;

  2. public abstract class CarBuilder
  3. {
  4.    //建造一个模型,要给一个顺序,就是组装顺序
  5.    public abstract void setSequence(ArrayList<String> sequece);
  6.    //设置完毕顺序后,就可以直接拿到这个车辆模型
  7.    public abstract CarModel getCarModel();
  8. }
复制代码

下面就是两个实现的类BenzBuilder 和 BMWBuilder:
  1. import java.util.ArrayList;

  2. public class BenzBuilder extends CarBuilder
  3. {
  4.    private BenzModel benz = new BenzModel();

  5.    public CarModel getCarModel()
  6.    {
  7.        return this.benz;
  8.    }

  9.    public void setSequence(ArrayList<String> sequece)
  10.    {
  11.       this.benz.setSequence(sequece);
  12.    }

  13. }
复制代码
  1. import java.util.ArrayList;

  2. public class BenzBuilder extends CarBuilder
  3. {
  4.    private BenzModel benz = new BenzModel();

  5.    public CarModel getCarModel()
  6.    {
  7.        return this.benz;
  8.    }

  9.    public void setSequence(ArrayList<String> sequece)
  10.    {
  11.       this.benz.setSequence(sequece);
  12.    }

  13. }
复制代码

然后就是Director这个的导演类:
  1. import java.util.ArrayList;

  2. public class Director
  3. {
  4.    private ArrayList<String> sequence = new ArrayList<String>();
  5.    private BenzBuilder benzBuilder = new BenzBuilder();

  6.    private BMWBuilder bmwBuilder = new BMWBuilder();
  7.    /**
  8.     * A类型的奔驰车模型,先start,然后stop,其他什么,一概没有
  9.     */
  10.    public BenzModel getABenzModel()
  11.    {
  12.       //清理,这个得注意
  13.       this.sequence.clear();
  14.       //这只ABenzModel的执行顺序
  15.       this.sequence.add("start");
  16.       this.sequence.add("stop");
  17.       //按照顺序返回一个奔驰车
  18.       this.benzBuilder.setSequence(this.sequence);

  19.       return (BenzModel)this.benzBuilder.getCarModel();
  20.    }
  21.    /**
  22.     * B型号的奔驰车模型,是先发动引擎,然后启动,然后停止,没有喇叭
  23.     */
  24.    public BenzModel getBBenzModel()
  25.    {
  26.        this.sequence.clear();
  27.        this.sequence.add("engine boom");
  28.        this.sequence.add("start");
  29.        this.sequence.add("stop");

  30.        this.benzBuilder.setSequence(this.sequence);
  31.        return (BenzModel)this.benzBuilder.getCarModel();
  32.    }
  33.    /**  
  34.     * C 型号的宝马车是先按下喇叭,然后启动,然后停止
  35.     */
  36.    public BMWModel getCBMWModel()
  37.    {
  38.        this.sequence.clear();

  39.        this.sequence.add("alarm");
  40.        this.sequence.add("start");
  41.        this.sequence.add("stop");

  42.        this.bmwBuilder.setSequence(this.sequence);
  43.        return (BMWModel)this.bmwBuilder.getCarModel();
  44.    }
  45.    /**
  46.     * D类型的宝马只有一个功能,就是跑。启动起来就跑,永远不停止
  47.     */

  48.    public BMWModel getDBMWModel()
  49.    {
  50.         this.sequence.clear();
  51.         this.sequence.add("start");
  52.         this.bmwBuilder.setSequence(this.sequence);
  53.         return (BMWModel)this.benzBuilder.getCarModel();
  54.    }
  55. }
  56.                                     
复制代码

然后就是用户类:

  1. public class Client
  2. {
  3.         public static void main(String args[])
  4.         {
  5.            Director director = new Director();
  6.            //1w辆A类型的奔驰车
  7.           for(int i=0; i < 10000; i++)
  8.           {
  9.             director.getABenzModel().run();
  10.           }
  11.             //100w辆B类型的奔驰车
  12.            for(int i=0; i < 1000000; i++)
  13.           {
  14.              director.getBBenzModel().run();
  15.           }
  16.        }
  17. }
复制代码



2015-01-23 18:09:37 的屏幕截图.png








本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-24 03:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表