建造者设计模式

建造者设计模式

内容列表:

  • 建造者模式
  • 建造者模式实现
  • 示例代码
  • 使用
  • jdk中的应用

建造者模式

和工厂、抽象工厂设计模式一样,builder设计模式也是对象创建类型中的一种。当创建的对象比较复杂的时候,特别是包含的属性比较多,工厂方法创建此类对象是比较麻烦的,builder是为了解决这类问题而引入的。 工厂方法创建此类对象时主要有以下几类问题需要解决:

  • 当有很多参数的时候,特别是当这些参数比较多的时候,client在调用工厂类创建对象的时候很容易出错。
  • 其中传递的参数,有些是必须要传递的,而有些是可选的,此时,我们需要设置可选的参数为null。
  • 如果对象很重,创建的过程比较复杂,这会使得工厂类更复杂。

我们可以提供一个只包含必须传递参数的构造函数,另外在提供可选字段的set方法来设置可选的参数。但是这种方法,要显示的调用的set方法来保证对象状态的一致性。

建造者设计模式可以使得我们一步一步创建对象,并能返回最终的对象,进而避免上述问题。

建造者模式实现

  • 首先创建一个静态内部类,把外部类的所有属性拷贝到静态内部类里面,同时为了遵循命名的规范,我们以类名Builder来命名内部类。
  • 静态内部类包含一个public的构造函数,所有必需传递的参数作为构造函数的参数。
  • 静态内部类应该提供设置可选参数的入口,即可选参数对应的set方法同时当连续调用多个属性的set方法之后,应该保证返回的是同一个builder对象。
  • 最后一步要在静态内部类中实现一个builder方法,这个方法会返回外部类的对象。通过在外部类中实现一个private的私有构造函数,静态内部类作为参数来实现。

示例代码

public class Computer {

    //required parameters
    private String HDD;
    private String RAM;

    //optional parameters
    private boolean isGraphicsCardEnabled;
    private boolean isBluetoothEnabled;

    public String getHDD() {
        return HDD;
    }

    public String getRAM() {
        return RAM;
    }

    public boolean isGraphicsCardEnabled() {
        return isGraphicsCardEnabled;
    }

    public boolean isBluetoothEnabled() {
        return isBluetoothEnabled;
    }

    private Computer(ComputerBuilder builder) {
        this.HDD = builder.HDD;
        this.RAM = builder.RAM;
        this.isGraphicsCardEnabled = builder.isGraphicsCardEnabled;
        this.isBluetoothEnabled = builder.isBluetoothEnabled;
    }
    
    @Override
    public String toString() {
        return "Computer [HDD=" + HDD + ", RAM=" + RAM + ", isGraphicsCardEnabled="
               + isGraphicsCardEnabled + ", isBluetoothEnabled=" + isBluetoothEnabled + "]";
    }

    //Builder Class
    public static class ComputerBuilder {
        // required parameters
        private String  HDD;
        private String  RAM;
        // optional parameters
        private boolean isGraphicsCardEnabled;
        private boolean isBluetoothEnabled;

        public ComputerBuilder(String hdd, String ram) {
            this.HDD = hdd;
            this.RAM = ram;
        }

        public ComputerBuilder setGraphicsCardEnabled(boolean isGraphicsCardEnabled) {
            this.isGraphicsCardEnabled = isGraphicsCardEnabled;
            return this;
        }

        public ComputerBuilder setBluetoothEnabled(boolean isBluetoothEnabled) {
            this.isBluetoothEnabled = isBluetoothEnabled;
            return this;
        }

        public Computer build() {
            return new Computer(this);
        }
    }
}

使用

public class TestBuilderPattern {

    public static void main(String[] args) {
        //Using builder to get the object in a single line of code and
        //without any inconsistent state or arguments
        Computer comp = new Computer.ComputerBuilder(
        "500 GB", "2 GB").setBluetoothEnabled(true)
        .setGraphicsCardEnabled(true).build();
        
        
        System.out.println(comp);
        //Computer [HDD=500 GB, RAM=2 GB, isGraphicsCardEnabled=true, isBluetoothEnabled=true]

     }
}

jdk中的应用

  • java.lang.StringBuilder#append() (unsynchronized)
  • java.lang.StringBuffer#append() (synchronized)
时间: 2024-10-06 11:03:39

建造者设计模式的相关文章

design pattern Builder 建造者设计模式

其实设计模式可以学的很有意思的,不需要非得如此硬枯燥地去啃FOG的大部头,当然这些骨头啃啃也健康. 本文利用建造者模式设计一个有趣的场景,一个利用这个模式去学功夫的过程,呵呵. 首先设计一个基类,学功夫先要有基础嘛: class 功夫 { public: virtual void 看招() = 0; }; 有了基础之后,我们就可以学习高级功法了,这里学习降龙十八掌,O(∩_∩)O~. list<int>容器,相当于记录下来的武功招式了,记住这些招式之后就可以开始学习了.小宝曰:绝世武功这么厚,

设计模式 之 建造者

建造者模式(Builder Pattern)     一听这个名字,你可能就会猜到一二分了.建造者简单理解就是造东西,仅仅只是建造者模式建造的不是一个简单的东西,是一个比較复杂的东西.就好像盖房子,须要打地基.砌墙.灌水泥.封顶,最后墙面贴瓷砖. 建造者设计模式是一个构造复杂对象的设计模式.在一个软件系统中,可能会面临创建一个复杂对象的工作,假设我们使用单一的方法或者单一的对象来创建会比較烦琐,当所创建复杂对象发生改变时,整个系统就可能面临剧烈的变化.这时就须要我们将这个复杂对象的创建过程分解成

设计模式--建造者(Builder)模式

将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示                                                         --<设计模式>GOF Insus.NET在ASP.NET环境中,列举一个建造者设计模式(Builder)例子,以最帖近开发环境与需求. 开发站点时,我们需要开发新闻类,视频类,图片类等等.每个网页还有可能是页头,内容,页脚等.开发这些页头,内容与页脚时,我们会使用用户控件来写好,加载至网页中去. 每个类别的网页,

设计模式——建造者

最近的心得,我发现学一门设计模式,不管你是否能立刻理解它,第一最要紧的是要记住两个东西.1.它是属于什么范畴的设计模式.2.记住UML图.这两个是打开这个设计模式之门的金钥匙!为什么这么讲?因为刚刚学新的设计模式,如果一味的埋头在文字中,思想中,代码编写的例子中,如果你这个设计模式又不是看的很懂,实在是会让人晕头转向看的吐血身亡.结果在身亡前,你都不知道这个设计模式干什么用,也不知该怎么去写.心得是,看完一篇设计模式文章,先记住它属于什么范畴的设计模式,然后就是把UML类图背记下来.再然后回头再

设计模式05-建造者模式

1. 概念 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 . 适用性: 1.当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时.  2.当构造过程必须允许被构造的对象有不同的表示时. 参与者: 1.Builder为创建一个Product对象的各个部件指定抽象接口. 2.ConcreteBuilder实现Builder的接口以构造和装配该产品的各个部件.定义并明确它所创建的表示.提供一个检索产品的接口. 3.Director 构造一个使用Builder接

设计模式——生成器

近期的心得,我发现学一门设计模式,无论你能否立马理解它,第一最要紧的是要记住两个东西.1.它是属于什么范畴的设计模式.2.记住UML图.这两个是打开这个设计模式之门的金钥匙.为什么这么讲?由于刚刚学新的设计模式.假设一味的埋头在文字中,思想中,代码编写的样例中,假设你这个设计模式又不是看的非常懂.实在是会让人晕头转向看的吐血身亡.结果在身亡前,你都不知道这个设计模式干什么用.也不知该怎么去写.心得是,看完一篇设计模式文章.先记住它属于什么范畴的设计模式,然后就是把UML类图背记下来.再然后回头再

Android设计模式之一个例子让你彻底明白工厂模式(Factory Pattern)

提出疑问 这几天研究工厂模式的时候,看到网上的一些文章中举的例子我就很疑惑,我相信这也是许多人的疑惑:工厂模式的功能就是创建实例,我们创建实例直接new不就完了吗,干嘛还得再封装一层工厂类,然后用工厂类再去new出这个实例?这不多此一举吗? 比如我看到这样的例子,我们的用户分为金牌用户和银牌用户,我们要创建一个金牌用户或者银牌用户. 定义一个用户接口 public interface ICustomer { String describe(); } 金牌用户实现类 public class Go

建造者模式(Builder)

将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 如果我们用了建造者设计模式,用户就只需要指定需要建造的类型就可以得到他们,而具体建造的过程和细节就不需要知道. Builder 是为创建一个Product 对象的各个部件指定的抽象接口, ConcreateBuilder 是具体建造者,实现Builder 接口,构建和装配各个部件,Product 是具体的产品角色. Director 是构建一个使用Builder 接口的对象. 建造者模式使用的场合: 主要用于创建一些复

04-手机套餐:建造者模式

4.1关联背景故事 去营业厅办理手机套餐,有以下两种套餐可以选择: 1)20元包400条短信的套餐: 2)30元包600条短信的套餐. 并且两种套餐都必须开通彩铃业务. 4.2模式定义 建造者模式(Builder Pattern),在一个软件系统中,可能会面临创建一些复杂对象的工作,如果我们使用单一的方法或单一的对象来创建会比较繁琐,当所创建的复杂对象发生变化时,整个系统就可能面临剧烈的变化. 为了解决这个问题,我们可以将这个复杂对象的创建过程分解成若干个部分,各个子部分用一定的算法构成.但是,