热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

再战设计模式(三)之建造者模式

建造者模式他的本质主要是:分离了组件的构造(由builder来负责),和装配(由Director负责),从而构造出复杂的对象,这个模式使用于:某个对象构建过程复杂的情况下使用建造模式

建造者模式

 

他的本质主要是:

分离了组件的构造(由builder来负责),和装配(由Director负责),从而构造出复杂的对象,这个模式使用于:某个对象构建过程复杂的情况下使用

建造模式可以将一个产品的内部表象(internal representation)与产品的生产过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。

由于实现了构建和装配的解耦。不同的构建器和不同的装配器 可以组合成很多不同的对象。也就是实现了构建算法、装配 算法的解耦,实现了更好的复用

场景:

 在日常开发中,有时候我们需要一个复杂的对象.由于需求的原因.但是其中各部分的子对象经常变化,但是我们可以让他们组合起来相对简单稳定

使用场景. 1.我们需要很多零件 2.我们要把这些零件组装起来 当然在工作中,可能要和工厂模式搭配起来使用

代码:

这些实例可以使用简单工厂模式来生成不同的发动机 座椅啊.轮胎啊.

/**
 * 汽车
 * @Created by xiaodao
 */
public class Car {

    private Seat seat;
    private Engine engine;//发动机

    private Tyre tyre;//轮胎



    public Car(Seat seat, Engine engine, Tyre tyre) {

        this.seat = seat;
        this.engine = engine;
        this.tyre = tyre;
    }

    public Seat getSeat() {
        return seat;
    }

    public void setSeat(Seat seat) {
        this.seat = seat;
    }

    public Engine getEngine() {
        return engine;
    }

    public void setEngine(Engine engine) {
        this.engine = engine;
    }

    public Tyre getTyre() {
        return tyre;
    }

    public void setTyre(Tyre tyre) {
        this.tyre = tyre;
    }
}

/**
 * @Created by xiaodao
 * 引擎实例
 */
public class Engine {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Engine(String name) {
        this.name = name;
    }
}


/**
 * @Created by xiaodao
 * 座椅
 */
public class Seat {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Seat(String name) {
        this.name = name;
    }
}

/**
 * @Created by xiaodao
 *轮胎
 */
public class Tyre {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Tyre(String name) {
        this.name = name;
    }
}

builder接口:

/**
 * @Created by xiaodao
 * 构建接口 这里也可以是抽象方法
 */
public interface CarBuilder {

    /**
     * 构建引擎
     *
     * @return
     */
    Engine builderEngine();

    Seat builderSeat();

    Tyre builderTyre();
}

builder实现类:

/**
 * @Created by xiaodao
 */
public class AudiCarBuilderImpl implements CarBuilder {
    @Override
    public Engine builderEngine() {
        return new Engine("奥迪引擎");
    }

    @Override
    public Seat builderSeat() {
        return new Seat("奥迪座椅");
    }

    @Override
    public Tyre builderTyre() {
        return new Tyre("奥迪轮胎");
    }
}

direactor:用来引入builder类的引用.他不知道builder的子类是什么

/**
 * @Created by xiaodao
 */
public class CarDirector {

    private CarBuilder builder;

    public CarDirector(CarBuilder builder) {
        this.builder = builder;
    }

    /**
     * 装配汽车
     * @return
     */
    public Car directCar(){

        Engine engine = builder.builderEngine();
        Seat seat = builder.builderSeat();
        Tyre tyre = builder.builderTyre();
        return new Car(seat,engine,tyre);
    }
}

调用者:

public class Client {
    public static void main(String[] args) {

        CarDirector carDirector = new CarDirector(new AudiCarBuilderImpl());
        Car car = carDirector.directCar();
        System.out.println(car.getEngine().getName());
        System.out.println(car.getSeat().getName());
        System.out.println(car.getTyre().getName());
    }
}

奥迪引擎
奥迪座椅
奥迪轮胎

类图:

 

登场角色

builder角色负责定义用户生成实例的接口 

concreteBuilder(具体的builder) concreteBuilder角色是实现了Builder接口的类.定义了具体的方法

director(监工) 负责使用builder角色的接口来生成实例,他不依赖与Builder的子类 无论子类如何定义都不影响 director的使用

client 具体的调用者 

这里我们可以把car 的各种属性变成工厂模式 

总结:

建造者模式与抽象工厂模式相似.(director 和abstractFactory 的实现类)今天下午与同事讨论半天总是在这方面比较模糊.欢迎大家踊跃评论.

个人感觉工厂模式是用于创建什么样的对象

建造模式就用来怎么创建对象

工厂方法模式和建造者模式都属于对象创建类模式,都用来创建类的对象。但它们之间的区别还是比较明显的。  

下面来自某位群友的讲解

 ● 意图不同  

   在工厂方法模式里,我们关注的是一个产品整体,如超人整体,无须关心产品的各部分是如何创建出来的;但在建造者模式中,一个具体产品的产生是依赖各个部件的产生以及装配顺序,它关注的是“由零件一步一步地组装出产品对象”。简单地说,工厂模式是一个对象创建的粗线条应用,建造者模式则是通过细线条勾勒出一个复杂对象,关注的是产品组成部分的创建过程。  

 ● 产品的复杂度不同   

  工厂方法模式创建的产品一般都是单一性质产品,如成年超人,都是一个模样,而建造者模式创建的则是一个复合产品,它由各个部件复合而成,部件不同产品对象当然不同。这不是说工厂方法模式创建的对象简单,而是指它们的粒度大小不同。一般来说,工厂方法模式的对象粒度比较粗,建造者模式的产品对象粒度比较细。   两者的区别有了,那在具体的应用中,我们该如何选择呢?是用工厂方法模式来创建对象,还是用建造者模式来创建对象,这完全取决于我们在做系统设计时的意图,如果需要详细关注一个产品部件的生产、安装步骤,则选择建造者,否则选择工厂方法模式。

 


推荐阅读
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • 认识Vue关于Vue的描述有不少,不外乎都会拿来与Angular和React对比,同样头顶MVVM双向数据驱动设计模式光环的Angular自然被对比的最多,但到目前为止,Angul ... [详细]
author-avatar
广佛笑嘻嘻_229
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有