鱼C论坛

 找回密码
 立即注册
查看: 2165|回复: 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:
import java.util.*;

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

  //启动
  protected abstract void start();
  //停止
  protected abstract void stop();
  //喇叭的叫
  protected abstract void alarm();
  //引擎的响
  protected abstract void engineBoom();

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

        if(actionName.equalsIgnoreCase("start"))
        {
           this.start();
        }else if(actionName.equalsIgnoreCase("stop"))
        {
           this.stop();
        }else if(actionName.equalsIgnoreCase("alarm"))
        {
           this.alarm();
        }else if(actionName.equalsIgnoreCase("engine boom"))
        {
           this.engineBoom();
        }
     }
  }
  //把传递过来的值传递到类内
   final public void setSequence(ArrayList<String> sequence)
   {
      this.sequence = sequence;
   }
}
然后就是两个实现类BenzModel与BMWBuilder
public class BenzModel extends CarModel
{
   protected void alarm()
   {
      System.out.println("奔驰车的喇叭声音是这个样子的...");
   }
   protected void engineBoom()
   {
       System.out.println("奔驰的引擎是这个声音...");
   }
   protected void start()
   {
      System.out.println("奔驰车跑起来啦...");
   }
   protected void stop()
   {
      System.out.println("奔驰车停下来啦...");
   }

}
public class BMWModel extends CarModel
{
   protected void alarm()
   {
      System.out.println("宝马车的喇叭声音是这个样子的...");
   }
   protected void engineBoom()
   {
      System.out.println("宝马车的引擎是这个声音...");
   }
   protected void start()
   {
      System.out.println("宝马车跑起来啦...");
   }
   protected void stop()
   {
      System.out.println("宝马车停下来啦...");
   }

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

public abstract class CarBuilder
{
   //建造一个模型,要给一个顺序,就是组装顺序
   public abstract void setSequence(ArrayList<String> sequece);
   //设置完毕顺序后,就可以直接拿到这个车辆模型
   public abstract CarModel getCarModel();
}
下面就是两个实现的类BenzBuilder 和 BMWBuilder:
import java.util.ArrayList;

public class BenzBuilder extends CarBuilder
{
   private BenzModel benz = new BenzModel();

   public CarModel getCarModel()
   {
       return this.benz;
   }

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

}
import java.util.ArrayList;

public class BenzBuilder extends CarBuilder
{
   private BenzModel benz = new BenzModel();

   public CarModel getCarModel()
   {
       return this.benz;
   }

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

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

public class Director
{
   private ArrayList<String> sequence = new ArrayList<String>();
   private BenzBuilder benzBuilder = new BenzBuilder();

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

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

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

       this.sequence.add("alarm");
       this.sequence.add("start");
       this.sequence.add("stop");

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

   public BMWModel getDBMWModel()
   {
        this.sequence.clear();
        this.sequence.add("start");
        this.bmwBuilder.setSequence(this.sequence);
        return (BMWModel)this.benzBuilder.getCarModel();
   }
}
                                     
然后就是用户类:
public class Client
{
        public static void main(String args[])
        {
           Director director = new Director();
           //1w辆A类型的奔驰车
          for(int i=0; i < 10000; i++)
          {
            director.getABenzModel().run();
          }
            //100w辆B类型的奔驰车
           for(int i=0; i < 1000000; i++)
          {
             director.getBBenzModel().run();
          }
       }
}


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








本帖被以下淘专辑推荐:

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 12:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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