`
ideal46
  • 浏览: 30179 次
  • 性别: Icon_minigender_1
  • 来自: 陕西
社区版块
存档分类
最新评论

构建者模式

阅读更多
定义: 从一个简单对象一步一步构造复杂对象
优点及使用:
  • 仅仅通过指定的类型和内容构建复杂对象,而且隐藏构造的实现细节
  • 解耦通过对象组件构造一个复杂对象的过程
  • 分离构造和显示的代码
  • 通过构造过程达到良好的控制
  • 相关模式有:
  •         抽象工厂:重点是在工厂模式(简单工厂或者复杂工厂),而构建者模式重点是由简单对象构建复杂对象
            复合模式:它经常被用来构建复杂对象


例子:
  为了建设一座房子,我们需要按照以下步骤:
    1.建设基础设施
    2.建设主体框架
    3.装修外部
    4.装修内部
让我们用一个抽象类HouseBuilder来定义这四个步骤。任何HouseBuilder的子类需要根据这四个步骤建设房子(也就是在子类中实现这四个方法),接着我们用WorkShop来规范这四个步骤的顺序(也就是必须完成前三步才能装修内部)。类TestBuilder用来测试这些类的协调性和检查构建过程。
import java.util.*;

class WorkShop{
   //规范构建过程顺序
  public void construnct(HouseBuilder hb){
      hb.buildFoundation();
      hb.buildFrame();
      hb.buildExterior();
      hb.buildInterior();
  }
}

//定义建房子的方法
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();
}

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");
    } 
}

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());
   }
}
//需要jdk1.5或者以上版本

}


也可以通过将每个方法设计成类来改良以上例子,相似的方法类可以一次设计处处使用,例如:窗户,门,厨房等等。
分享到:
评论

相关推荐

    构建者模式、回调和观察者设计模式

    构建者模式、回调和观察者设计模式是软件开发中常用的设计模式,它们分别在不同的场景下发挥着重要的作用。下面将详细介绍这三个设计模式,并通过一个简单的例子来展示它们的应用。 首先,构建者模式(Builder ...

    设计模式_创建型_构建者模式.md

    构建者模式是创建型设计模式的一种,它允许用户通过指定复杂对象的类型和内容来逐步创建它们。该模式分离了对象的构建和表示,使其能够创建不同的表示,而不需要改变构建过程。 在软件开发中,构建者模式特别适用于...

    详解java构建者模式Builder

    详解 Java 构建者模式 Builder Java 构建者模式 Builder 是一种创建型模式,用于一步步创建一个复杂对象。该模式将构建复杂对象的过程和它的部件解耦,使得构建过程和部件的表示隔离。这种模式非常适合在构建复杂...

    构建者模式在Java面向对象编程中的应用与优势

    构建者模式在Java面向对象编程中的应用与优势

    设计您的足球引擎,并学习如何应用设计模式(观察者,装饰者,策略和构建者模式)-第一部分和第二部分

    在本教程中,我们将探索如何设计一个足球引擎,并利用四个重要的设计模式——观察者模式、装饰者模式、策略模式和构建者模式。这些模式是软件工程中的核心概念,能够提高代码的灵活性、可维护性和可扩展性。我们将...

    BaseActivityTitleFactory:本项目是一个Android快速开框架,通过这个项目,起码可以熟练的运用:工厂模式;构建者模式;单例模式;适配器模式;接口、抽象类、回调

    构建者模式 单例模式 适配器模式 接口、抽象类、回调 在我看来,可复用的模块不止功能类,也可以是页面的布局元素,比如弹窗、标题栏、按钮等元素,由于是一个公司出品的app,所以整体风格元素都差不多,所以这些...

    设计模式自己总结一句话描述

    创建型模式,共五种: 工厂方法模式、抽象工厂模式、单例模式、构建者模式、原型模式。 结构型模式,共七种: 适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种...

    使用设计模式构建通用数据库访问类.

    本文将围绕“使用设计模式构建通用数据库访问类”这一主题,深入探讨如何通过抽象基类与继承机制,结合具体的设计模式,如工厂模式和策略模式,来创建一个灵活且高效的数据库访问层。 ### 设计模式的重要性 设计...

    Android利用建造者模式自定义Dialog

    建造者模式,作为一种设计模式,能够帮助我们优雅地构建复杂对象,它将对象的创建过程逐步分解,使得创建过程更加灵活,同时也使代码结构更加清晰。在本示例中,“Android利用建造者模式自定义Dialog”旨在利用这种...

    MNProgressHUD:一个常用的自定义弹框封装(适配AndroidX),加载ProgressDialog,状态显示的StatusDialog和自定义Toast,全部支持背景颜色,圆角,边框和文字的自定义,构建者模式,链式调用

    MNProgressDialog一个常用的自定义弹框封装(适配AndroidX),加载ProgressDialog,状态显示的StatusDialog和自定义Toast,全部支持背景颜色,圆角,边框和文字的自定义,构建者模式,链式调用。截图:...

    JAVA设计模式(创建模式 结构模式 行为模式)

    3. 构建者模式(Builder Pattern):将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。通常用于构建具有多种配置选项的对象。 4. 单例模式(Singleton Pattern):确保一个类只有一个实例...

    构造者模式

    在给定的文件列表中,我们可以看到几个关键类,它们可能是构建者模式的具体实现: 1. **DirectorResult.cs** - 这个类可能代表了“导演”角色,负责指导如何具体构建一个对象。导演类通常包含一个或多个方法,这些...

    C++设计模式原理与实战视频课

    2-10 构建者模式的实用工程技术——代码的坏味道:算法与对象构建的隔离 2-11 原型模式的定义场景与实现——对象的快速复制 2-12 原型模式的实用工程技术——DRY原则与使用模式进行重构 3-1 适配器模式的定义、场景...

    属于你设计模式

    3. **构建者模式**:它是一种创建型模式,将复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。构建者模式允许用户按步骤构建对象,提高了代码的灵活性和可维护性。 4. **适配器模式**:结构型...

    设计模式

    以上介绍了三种常用的设计模式——单例模式、构建者模式和原型模式,每种模式都有其特定的应用场景。理解并熟练掌握这些设计模式有助于提升代码质量和系统的灵活性。在实际开发中,可以根据项目的具体需求选择合适的...

    JAVA设计模式(十三种)

    - 构建者模式(Builder):构建者模式将复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。它可以更灵活地控制对象的构造过程。 - 单例模式(Singleton):单例模式确保一个类只有一个实例,并...

    关于软件架构,你要了解的种常用软件开发设计模式.docx

    构建者模式允许创建复杂的对象,通过步骤化构建过程,确保构建过程的正确性,同时隔离了对象的创建和表示。在大型系统中,构建者模式可以帮助管理对象的构建,尤其是在需要创建多种变体时。 总结: 以上五种设计...

    java的23种设计模式代码例子

    构建者模式用于分步骤创建复杂的对象,通过不同的具体构建器实现细节,使得相同的构建过程可以创建不同的表示。 ### 结构型模式 #### 1.6 适配器模式(Adapter) 适配器模式允许不兼容的接口之间的类能够一起工作...

    23种设计模式

    4. **Builder模式**:构建者模式允许你逐步构建一个复杂的对象,而不必一次性创建所有的部分。 5. **Prototype模式**:原型模式通过复制现有的实例来创建新对象,从而避免了创建新实例时的开销。 #### 结构型模式...

    builder-demo.zip

    在构建者模式中,有四个主要角色: 1. **产品(Product)**:这是要创建的复杂对象,拥有多个组成部分或属性。在代码中,它通常会定义一个接口或抽象类,用来表示产品的结构。 2. **建造者(Builder)**:定义了...

Global site tag (gtag.js) - Google Analytics