设计模式学习心得<建造者 Builder>
建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。
这种一步一步构造最终的对象的方式叫做 柯里化 (Currying)。
概述
意图:
将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。主要解决:
主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;
由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。
拆解产品的实现过程,让我联想到了敏捷开发。何时使用:
一些基本部件不会变,而其组合经常变化的时候。如何解决:
将变与不变分离开。关键代码:
建造者:创建和提供实例
导演:管理建造出来的实例的依赖关系。应用实例:
- 去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐"。
 - JAVA 中的 StringBuilder。
 
- 优点:
 
- 建造者独立,易扩展。
 - 便于控制细节风险。
 
- 缺点:
 
- 产品必须有共同点,范围有限制。
 - 如内部变化复杂,会有很多的建造类。
 
- 使用场景:
 
- 需要生成的对象具有复杂的内部结构。
 - 需要生成的对象内部属性本身相互依赖。
 
- 注意事项:
与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。 
实现
public class Message {
    private Integer id;
    private String phone;
    private String token;
    private String verificationCode;
    private Date verifiedAt;
    private String ipAddress;
    private Date createdAt;
    private Date updatedAt;
    public Message() {
    }
    public Message(String phone, String ipAddress, String token) {
        this.phone = phone;
        this.ipAddress = ipAddress;
        this.token = token;
    }
    public Message(String phone, String ipAddress, String token, String verificationCode) {
        this.phone = phone;
        this.ipAddress = ipAddress;
        this.token = token;
        this.verificationCode = verificationCode;
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    ..........
    public static MessageBuilder builder() {
        return new MessageBuilder();
    }
    public static class MessageBuilder {
        private String phone;
        private String ipAddress;
        private String token;
        private String verificationCode;
        public MessageBuilder withPhone(String phone) {
            this.phone = phone;
            return this;
        }
        public MessageBuilder withIpAddress(String ipAddress) {
            this.ipAddress = ipAddress;
            return this;
        }
        public MessageBuilder withToken(String token) {
            this.token = token;
            return this;
        }
        public MessageBuilder withVerificationCode(String verificationCode) {
            this.verificationCode = verificationCode;
            return this;
        }
        public Message build() {
            return new Message(phone, ipAddress, token, verificationCode);
        }
    }
}
提示:如果是使用idea,可以利用构造方法,协助生成构造者模式
- 选中构造方法,点击右键
 - 选择
Refactor,打开子菜单 - 点击
Replace Constructor With Builder... 
设计模式学习心得<建造者 Builder>的更多相关文章
- 设计模式学习心得<代理模式 Proxy>
		
在代理模式(Proxy Pattern)中,一个类代表另一个类的功能.这种类型的设计模式属于结构型模式. 在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口. 概述 意图 为其他对象提供 ...
 - 设计模式系列之代理模式(Proxy Pattern)——对象的间接访问
		
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
 - 设计模式学习之代理模式(Proxy,结构型模式)(11)
		
参考地址:http://www.cnblogs.com/zhili/p/ProxyPattern.html 一.引言 在软件开发过程中,有些对象有时候会由于网络或其他的障碍,以至于不能够或者不能直接访 ...
 - 设计模式学习之代理模式(Proxy)
		
一.代理模式的初衷 不想让客户端直接访问具体实现接口,客户端不应该直接访问具体实现,一般会涉及到以下四个对象 业务接口:定义客户端访问的接口,是实现类和代理类都需要实现的 实现类:实现了业务接口,真正 ...
 - Java设计模式学习记录-代理模式
		
代理模式 代理模式是常见设计模式的一种,代理模式的定义是:为其他对象提供一种代理以控制对这个对象的访问. 在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起 ...
 - 设计模式入门之代理模式Proxy
		
//代理模式定义:为其它对象提供一种代理以控制对这个对象的訪问 //实例:鉴于书中给出的样例不太好.并且有些疑问,所以直接用保护代理作为实例 //要求,一旦订单被创建,仅仅有订单的创建人才干够改动订单 ...
 - 学习笔记——代理模式Proxy
		
代理模式,主要是逻辑和实现解耦.具体逻辑如何,由代理Proxy自己来设计,我们只需要把逻辑Subject交给代理即可. 主要应用场景,包括创建大开销对象时,使用代理来慢慢创建:远程代理,如网络不确定时 ...
 - 《JAVA设计模式》之代理模式(Proxy)
		
在阎宏博士的<JAVA与模式>一书中开头是这样描述代理(Proxy)模式的: 代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. 代理模式的结 ...
 - javascript设计模式学习之六——代理模式
		
一.代理模式定义 代理模式的关键是:当客户不方便直接访问一个对象或者不满足需要的时候,提供一个替身对象来控制对这个对象的访问.代理模式需要和本体对外提供相同的接口,对用户来说是透明的.代理模式的种类有 ...
 - 设计模式学习心得<组合模式 Composite>
		
组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及整体层次.这种类型的设计模式属于结构型模式, ...
 
随机推荐
- SpringBoot配置(2) slf4j&logback
			
SpringBoot配置(2) slf4j&logback 一.SpringBoot的日志使用 全局常规设置(格式.路径.级别) SpringBoot能自动适配所有的日志,而且底层使用slf4 ...
 - [蓝桥杯]ALGO-187.算法训练_P0502
			
编写一个程序,读入一组整数,这组整数是按照从小到大的顺序排列的,它们的个数N也是由用户输入的,最多不会超过20.然后程序将对这个数组进行统计,把出现次数最多的那个数组元素值打印出来.如果有两个元素值出 ...
 - Python的hasattr(),getattr(),setattr()
			
今天读到源码时遇到了setattr()和getattr()两方法,给忘了,重新回顾一下吧! 1. hasattr(object, name) 判断object里是否有name属性,有就返回True,没 ...
 - 源码小结:Java 集合ArrayList,LinkedList 源码
			
现在这篇主要讲List集合的三个子类: ArrayList 底层数据结构是数组.线程不安全 LinkedList 底层数据结构是链表.线程不安全 Vector 底层数据结构是数组.线程安全 Array ...
 - CentOS安装mysql源码包
			
1.# cd /usr/local/src 2.上传mysql.tar.gz文件 3.# tar -zxvf mysql-5.6.36-linux-glibc2.5-x86_64.tar.gz 4.# ...
 - uva-10382-贪心
			
题意:对于长为L,宽为W的矩形草地,需要对它进行浇水,总共有n个水龙头,给每个水龙头的浇水半径,和位置.求覆盖整个草地需要的最小水龙头数量. 如图,把浇水的面积转换成矩形,然后就和区间覆盖一样了,直接 ...
 - SpringBoot 出现Whitelabel Error Page 解决办法
			
这是咋了,咋的就404了 我路径也挺对的啊 注解也都写上了啊 咋就找不到了呢? debug吧它不进方法 看日志吧,他还不报错 这家伙给我急的 百度一下午也没解决,最后还是看官网才知道错在了那里,程序只 ...
 - leetcode3
			
public class Solution { public int LengthOfLongestSubstring(string s) { var dic = new Dictionary< ...
 - leetcode75
			
class Solution { public: void sortColors(vector<int>& nums) { sort(nums.begin(), nums.end( ...
 - leetcode322
			
public class Solution { public int coinChange(int[] coins, int amount) { ) ; ]; dp[] = ; ;i <= am ...