设计模式总结篇系列:建造者模式(Builder)
关于建造者模式网上有很多文章,也有些不同的理解。在此结合网上其他文章对建造者模式进行总结。
总体说来,建造者模式适合于一个具有较多的零件(属性)的产品(对象)的创建过程。根据产品创建过程中零件的构造是否具有一致的先后顺序,可以将其分为如下两种形式。
一、通过Client、Director、Builder和Product形成的建造者模式
Builder负责Product类对象的具体过程构建,Director负责指导Build,要求Builder按照其指定的顺序去完成Produt的构造。最后通过Builder返回建造后的结果。网上有人对此种模式进行了形象的类比。
(转)
简单地说,就好象我要一座房子住,可是我不知道怎么盖(简单的砌墙,层次较低),也不知道怎么样设计(建几个房间,几个门好看,层次较高),于是我需要找一帮民工,他们会砌墙,还得找个设计师,他知道怎么设计,我还要确保民工听设计师的领导,而设计师本身也不干活,光是下命令,这里砌一堵墙,这里砌一扇门,这样民工开始建设,最后,我可以向民工要房子了。在这个过程中,设计师是什么也没有,除了他在脑子里的设计和命令,所以要房子也是跟民工要,记住了!
1.定义产品:
class Room { private Window window;
private Floor floor; public Window getWindow() {
return window;
} public void setWindow(Window window) {
this.window = window;
} public Floor getFloor() {
return floor;
} public void setFloor(Floor floor) {
this.floor = floor;
}
}
2.定义Builder接口(工人接口)(非必须):
package com.qqyumidi; /**
* 工人接口,定义了工人所要进行的工作。他们负责进行具体部件如窗户,地板的建造。同时因为房子是民工建的,因此建设完成后由他把房子递交回房主
*
*/
interface Builder { public void makeWindow(); public void makeFloor(); public Room getRoom();
}
3.定义具体的Builder——工人,工人用于完成房屋构造过程中每个具体的步骤:
class RoomBuilder implements Builder { private Room room = new Room(); @Override
public void makeWindow() {
room.setWindow(new Window());
} @Override
public void makeFloor() {
room.setFloor(new Floor());
} @Override
public Room getRoom() {
return room;
} }
4.定义Director——房子设计师:
class Designer { public void command(Builder builder){
// 先建造地板
builder.makeFloor();
// 再建造窗户
builder.makeWindow();
}
}
5.定义Client——房主,房主请设计师和工人造房子:
public class Client { public static void main(String[] args) {
// 先找来一个工人
Builder builder = new RoomBuilder();
// 再找来一个房屋设计师
Designer designer = new Designer();
// 工人按照设计师设计建造
designer.command(builder);
// 工人向雇主交房子
Room newRoom = builder.getRoom();
} }
OK,这这样,一座房子建好了。
二、通过静态内部类等方式实现的零件无序话构造:
常见的经典代码如下:
package com.qqyumidi; public class Client { public static void main(String[] args) {
User.Builder builder = new User.Builder();
User user = builder.setName("corn").setAge(100).setAddress("广州").build();
}
} class User { private String name;
private int age;
private String address; public String getName() {
return name;
} public int getAge() {
return age;
} public String getAddress() {
return address;
} public static class Builder {
private User user = new User(); public Builder setName(String name) {
user.name = name;
return this;
} public Builder setAge(int age) {
user.age = age;
return this;
} public Builder setAddress(String address) {
user.address = address;
return this;
} public User build() {
return user;
}
}
}
使用此种方式可以直接通过联级形式构造对象非常直观方便。Android中的AlertDialog即采用此种方式创建。
设计模式总结篇系列:建造者模式(Builder)的更多相关文章
- 【转】设计模式(三)建造者模式Builder(创建型)
(http://blog.csdn.net/hguisu/article/details/7518060) 1. 概述 在软件开发的过程中,当遇到一个"复杂的对象"的创建工作,该对 ...
- 设计模式(三)建造者模式Builder(创建型)
1. 概述 在软件开发的过程中,当遇到一个“复杂的对象”的创建工作,该对象由一定各个部分的子对象用一定的算法构成,由于需求的变化,复杂对象的各个部分经常面临剧烈的变化,但将它们组合在一起的算法相对稳定 ...
- 设计模式(四)建造者模式 Builder
Builder: <Effective Java> 第2条:遇到多个构造器参数时要考虑用构建器. 建造者模式(Builder Pattern),也称生成器模式,定义如下: 将一个复杂对象的 ...
- 设计模式之九:建造者模式(Builder)
建造者模式: 将一个复杂对象的建造过程和它的表示分离开来,这样同样的建造过程能够创建不同的表示. Separate the construction of a complex object from ...
- 设计模式系列之建造者模式(Builder Pattern)——复杂对象的组装与创建
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- 设计模式(五)建造者模式(Builder Pattern)
一.引言 在软件系统中,有时需要创建一个复杂对象,并且这个复杂对象由其各部分子对象通过一定的步骤组合而成.例如一个采购系统中,如果需要采购员去采购一批电脑时,在这个实际需求中,电脑就是一个复杂的对象, ...
- Java设计模式(3)建造者模式(Builder模式)
Builder模式定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. Builder模式是一步一步创建一个复杂的对象,它允许用户可以只通过指定复杂对象的类型和内容就可以构 ...
- 【原】iOS设计模式之:建造者模式Builder Pattern,用于改进初始化参数
本文主要讨论一下iOS中的Builder Pattern.与网上很多版本不同,本文不去长篇大论地解释建造者模式的概念,那些东西太虚了.设计模式这种东西是为了解决实际问题的,不能为了设计模式而设计模式, ...
- 乐在其中设计模式(C#) - 建造者模式(Builder Pattern)
原文:乐在其中设计模式(C#) - 建造者模式(Builder Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 建造者模式(Builder Pattern) 作者:webabc ...
随机推荐
- java中的反射整理
1,什么是反射 反射机制是java语言提供的一种基础功能,它能够赋予成语在运行时进行自省的能力.通过反射我们可以直接操作类或者对象,例如:可以通过反射去获取某个对象的类的定义,属性,方法,还可以修改类 ...
- Linux下Shell重定向
1. 标准输入,标准输出与标准错误输出 Linux下系统打开3个文件,标准输入,标准输出,标准错误输出. 标准输入:从键盘输入数据,即从键盘读入数据. 标准输出:把数据输出到终端上. 标准错误输出:把 ...
- Egret获取和显示时间,年,月,日,时分秒
let now = new Date(); this.nowYear = now.getFullYear(); this.nowMonth = now.getMonth() + 1; let noww ...
- NOIP-火柴棒等式
题目描述 给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A.B.C是用火柴棍拼出的整数(若该数非零,则最高位不能是0).用火柴棍拼数字0-9的拼法如图所示: 注意: 1. 加号与等 ...
- 修改 Docker 的 daemon.json后启动失败
创建Harbor要把register 换成Harbor地址 vim /etc/docker/daemon.json添加{ "insecure-registries":[" ...
- SpringMVC+Mybatis+MySQL8遇到的问题
搭建SpringMVC+Mybatis+MySQL8过程中遇到的坑. 1.数据库驱动要使用新版本,我的和mysql保持一致. 查看mysql版本:MySQL\bin>mysql -V 配置对应版 ...
- Android Architecture Components--项目实战
转载请注明出处,谢谢! 上个月Google Android Architecture Components 1.0稳定版发布,抽工作间隙写了个demo,仅供参考 Github地址:https://gi ...
- MySQL之爱之初体验
写在前言:本篇博客从mysql的安装开始说起,至于什么是数据库以及数据的由来什么的,不在详谈!!! 第一:mysql安装 linux安装:两种方式 1.apt安装 apt install mysql- ...
- [LeetCode] Hand of Straights 一手顺子牌
Alice has a hand of cards, given as an array of integers. Now she wants to rearrange the cards into ...
- Python基础之面向对象2(封装)
一.封装定义: 二.作用 三.私有成员: 1.基本概念及作用 2.__slots__手段私有成员: 3.@property属性手段私有成员: 四.基础示例代码 1.用方法封装变量 "&quo ...