当前位置:天才代写 > tutorial > JAVA 教程 > Java设计模式(二)

Java设计模式(二)

2017-11-10 08:00 星期五 所属: JAVA 教程 浏览:439

副标题#e#

Builder

界说

一步一步从简朴工具成立起巨大工具

那里利用和益处

仅仅明晰范例和内容就可以做出一个巨大工具。建成的工具与建设它的细节分隔。

将建设一个巨大工具的进程和该工具所包括的组件做接耦化。

将建设和表达的代码疏散。

措施员对建设的进程有更好的节制。

相关模式包罗:

抽象工场模式,它主要是会合在工场模式的层面,也许简朴,也许巨大。而一个Builder模式主要用来成立基于简朴工具的巨大工具。

复合模式,主要用来成立巨大工具。

举例

好比建一个屋子,我们需要这么几步:

1 打基本

2 建框架

3 建室外

4 建室内

让我们用一个抽象类HouseBuilder来界说这四步。任何HouseBuilder类的子类将遵循这四步来建这个屋子(也就是说,实施子类里的四个要领)。然后我们用一个WorkShop的类来强制实施这四步的顺序(也就是说,我们必需要在前三步都完成的环境下,才气建室内)。TestBuilder类将用来测试这些类之间的协调性以及检讨建房的进程。

import java.util.*;
class WorkShop {
   //force the order of building process
   public void construct(HouseBuilder hb) {
     hb.buildFoundation();
     hb.buildFrame();
     hb.buildExterior();
     hb.buildInterior();
   }
}


#p#副标题#e#

//建房的抽象类中界说了建房的4个要领

abstract class HouseBuilder {
   protected House house = new House();
   protected String showProgress() {
     return house.toString();
   }
   abstract public void buildFoundation();
   abstract public void buildFrame();
   abstract public void buildExterior();
   abstract public void buildInterior();
}

//建一层屋子,留意它的4个要领的详细实施

class OneStoryHouse extends HouseBuilder {
   public OneStoryHouse(String features) {
     house.setType(this.getClass() + " " + features);
   }
   public void buildFoundation() {
     //doEngineering()
     //doExcavating()
     //doPlumbingHeatingElectricity()
     //doSewerWaterHookUp()
     //doFoundationInspection()
     house.setProgress("foundation is done");
   }
   public void buildFrame() {
     //doHeatingPlumbingRoof()
     //doElectricityRoute()
     //doDoorsWindows()
     //doFrameInspection()
     house.setProgress("frame is done");
   }
   public void buildExterior() {
     //doOverheadDoors()
     //doBrickWorks()
     //doSidingsoffitsGutters()
     //doDrivewayGarageFloor()
     //doDeckRail()
     //doLandScaping()
     house.setProgress("Exterior is done");
   }
   public void buildInterior() {
     //doAlarmPrewiring()
     //doBuiltinVacuum()
     //doInsulation()
     //doDryWall()
     //doPainting()
     //doLinoleum()
     //doCabinet()
     //doTileWork()
     //doLightFixtureBlinds()
     //doCleaning()
     //doInteriorInspection()
     house.setProgress("Interior is under going");
   }
}

#p#副标题#e#

//建两层屋子,留意它的4个要领的详细实施和建一层屋子的差异

class TwoStoryHouse extends HouseBuilder {
   public TwoStoryHouse(String features) {
     house.setType(this.getClass() + " " + features);
   }
   public void buildFoundation() {
     //doEngineering()
     //doExcavating()
     //doPlumbingHeatingElectricity()
     //doSewerWaterHookUp()
     //doFoundationInspection()
     house.setProgress("foundation is done");
   }
   public void buildFrame() {
     //doHeatingPlumbingRoof()
     //doElectricityRoute()
     //doDoorsWindows()
     //doFrameInspection()
     house.setProgress("frame is under construction");
   }
   public void buildExterior() {
     //doOverheadDoors()
     //doBrickWorks()
     //doSidingsoffitsGutters()
     //doDrivewayGarageFloor()
     //doDeckRail()
     //doLandScaping()
     house.setProgress("Exterior is waiting to start");
   }
   public void buildInterior() {
     //doAlarmPrewiring()
     //doBuiltinVacuum()
     //doInsulation()
     //doDryWall()
     //doPainting()
     //doLinoleum()
     //doCabinet()
     //doTileWork()
     //doLightFixtureBlinds()
     //doCleaning()
     //doInteriorInspection()
     house.setProgress("Interior is not started yet");
   }
}
class House {
   private String type = null;
   private List features = new ArrayList();
   public House() {
   }
   public House(String type) {
     this.type = type;
   }
   public void setType(String type) {
     this.type = type;
   }
   public String getType() {
     return type;
   }
   public void setProgress(String s) {
     features.add(s);
   }
   public String toString() {
     StringBuffer ff = new StringBuffer();
     String t = type.substring(6);
     ff.append(t + "n ");
     for (int i = 0; i < features.size(); i ++) {
       ff.append(features.get(i) + "n ");
     }
     return ff.toString();
   }
}
class TestBuilder {
   public static void main(String[] args) {
    HouseBuilder one = new OneStoryHouse("2 bedrooms, 2.5 baths, 2-car garage, 1500 sqft");
    HouseBuilder two = new TwoStoryHouse("4 bedrooms, 4 baths, 3-car garage, 5000 sqft");
    WorkShop shop = new WorkShop();
    shop.construct(one);
    shop.construct(two);

    System.out.println("Check house building progress: n");
    System.out.println(one.showProgress());
    System.out.println(two.showProgress());
  }
}

#p#副标题#e#

//需要用jdk1.5以上来编译

C:> javac TestBuilder.java
C:> java TestBuilder

//运行功效

#p#分页标题#e#

Check house building progress:
OneStoryHouse 2 bedrooms, 2.5 baths, 2-car garage, 1500 sqft
foundation is done
frame is done
Exterior is done
Interior is under going
TwoStoryHouse 4 bedrooms, 4 baths, 3-car garage, 5000 sqft
foundation is done
frame is under construction
Exterior is waiting to start
Interior is not started yet

要更进一步优化上面这个例子的话,每一个doXXX的要领都可以设计成一个类。同样的成果类可以只设计一次,然后被其他类利用,好比,门,窗,厨房等等。

别的,假如要写一个匹萨饼的措施,每一个身分都可以设计成一个类。一个匹萨饼至少包括了几种身分。差异的匹萨饼有差异的身分。这样,我们就可以将Builder的设计模式用上了。

 

    关键字:

天才代写-代写联系方式