设计模式--Builder生成器模式
如果文章中哪里有问题,希望各位大哥大姐指出,小弟十分感激。
正文
什么是生成器模式?
生成器模式就是把生产对象的过程进一步抽取、细化、独立。以往我们生产对象,可能就是在一个小作坊里面从头做到尾。现在用了生成器模式,就等于把这些生产步骤细化分割了,进行了分散操作,一道工序完了就下一道工序,换一道工序就换个地方。举个例子,就像建房子,房子需要地基、主体、大门、房间、花园、地下室…….。按照以前的写法,就等于你雇了一个施工队,然后将整个房子的建造都交给他们,而且你还要把全部要求给他们说明白,不然他们要么全给你造了,要么全没造。用了生成器模式后,我们初始先生成最基础、最不可缺少的内容:地基和房子主体。并且将大门、房间、花园、地下室…….这些附加的东西都分别外包给不同的施工队(方法),你想加什么东西,就雇佣什么施工队(调方法),并告诉他们你要弄成什么样子。最后你在来个验收(生成最后的对象),那就行了。
为什么要用生成器模式?
像前面说的,用生成器将对象的生成过程细分成不同部分,然后我们就可以更准确的去控制这个对象的生成。生成器模式很适合那个生成过程很复杂,且对象内部结构复杂,多变的类。例如前面提及的房子类,他的内部结构有很多,每个内部结构(属性)又有不同形式(值),就很适合这种模式去生成。再例如汽车,内部有车身、引擎、轮胎、座椅等等,每种又有不同的厂家、型号,更是复杂多变。
怎样使用生成器模式?
首先我们需要一些最基本的东西:
1:我们要生产的最终产品对象,如House。
2:我们要有组成最终产品的各个部件,如Building、Door、Basement、Room、Garden。
3:有一个建筑造公司,这个建造公司要有不同的施工队,如Builder
4:(非必须)一个销售人员,直接给你推销最终产品,怎么造房子由销售人员去联系建筑公司。如Salesperson


代码很长,建议先跳过main方法看其他的,最后才看main方法。
/**
* 生成器模式
* */
public class BuilderHouse {
public static void main(String[] args) {
/** 我有1百万 */
double myMoney = 1000000;
/** 为了结婚去买套婚房 */
House myHouse = null;
/** 召唤一个售楼员 */
Salesperson salesperson = new Salesperson(); if(myMoney > 5000000) {
/** 售楼员觉得我可能有5百万,打算我推荐这个别墅 */
House bieShu = salesperson.bieShu();
myHouse = bieShu;
}else {
/** 可实际上我只是个穷鬼,所以售楼员推了这套80万的商品房 */
House shangPinLou = salesperson.shangPinLou();
/** 好了,这套在预算内,剁手了 */
myHouse = shangPinLou;
}
System.err.println(myHouse == null?"没房子找不到老婆":"有房子了,虽然小点,但起码老婆不嫌弃,美滋滋结婚了");
System.err.println(myHouse == null?"":myHouse);
}
} /**
* 房子--最终产品
* */
class House{
Building building; // 建筑主体
Door door; // 大门
List<Room> rooms; // 房间
Garden garden; // 花园
Basement basement; // 地下室
String description; // 房子简述
public House(Building building, Door door, List<Room> rooms, Garden garden, Basement basement,String description) {
this.building = building;
this.door = door;
this.rooms = rooms;
this.garden = garden;
this.basement = basement;
this.description = description;
}
public House() {}
@Override
public String toString() {
return "House [building=" + building + ", door=" + door + ", rooms=" + rooms + ", garden=" + garden
+ ", basement=" + basement + ", description=" + description + "]";
}
}
/**
* 建筑--也就是房子主体--中间产品
* */
class Building{
double area; // 面积
int floor; // 楼层
String description; // 大门描述
public Building(double area, int floor, String description) {
this.area = area;
this.floor = floor;
this.description = description;
}
public Building() { }
@Override
public String toString() {
return "Building [area=" + area + ", floor=" + floor + ", description=" + description + "]";
}
}
/**
* 大门--中间产品
* */
class Door{
double width; // 宽
double hight; // 高
String description; // 大门描述
public Door(double width, double hight, String description) {
this.width = width;
this.hight = hight;
this.description = description;
}
public Door() { }
@Override
public String toString() {
return "Door [width=" + width + ", hight=" + hight + ", description=" + description + "]";
}
}
/**
* 房间--中间产品
* */
class Room{
double area; // 面积
String description; // 房间描述
int windowNum; // 窗户个数
public Room(double area, String description, int windowNum) {
this.area = area;
this.description = description;
this.windowNum = windowNum;
}
public Room() { }
@Override
public String toString() {
return "Room [area=" + area + ", description=" + description + ", windowNum=" + windowNum + "]";
}
}
/**
* 花园--中间产品
* */
class Garden{
double area; // 面积
String description; // 花园样子
boolean hasSwimmingPool;// 是否要泳池
public Garden() {}
public Garden(double area, String description, boolean hasSwimmingPool) {
this.area = area;
this.description = description;
this.hasSwimmingPool = hasSwimmingPool;
}
@Override
public String toString() {
return "Garden [area=" + area + ", description=" + description + ", hasSwimmingPool=" + hasSwimmingPool + "]";
}
}
/**
* 地下室--中间产品
* */
class Basement{
double area; // 面积
double hight; // 地下室高
String description; // 地下室样子
public Basement() { }
public Basement(double area, double hight, String description) {
this.area = area;
this.hight = hight;
this.description = description;
}
@Override
public String toString() {
return "Basement [area=" + area + ", hight=" + hight + ", description=" + description + "]";
}
}
/**
* 建造者,也就是建筑公司
* */
class HouseBuilder{
House house; // 房子
public HouseBuilder() {
this.house = new House();
}
/**
* 建筑主体施工队,构建建筑主体
* */
public HouseBuilder buildBuilding(double area,int floor,String description) {
Building building = new Building();
building.area = area;
building.floor = floor;
building.description = description;
this.house.building = building;
return this;
}
/**
* 大门施工队,构建房子的大门
* */
public HouseBuilder buildDoor(double width,double hight,String description) {
Door door = new Door();
door.width = width;
door.hight = hight;
door.description = description;
this.house.door = door;
return this;
}
/**
* 房间施工队,构建房子的房间
* */
public HouseBuilder buildRooms(double area,int windowNum,String description,int roomNum) {
Room room = null;
List<Room> rooms = new ArrayList<Room>(roomNum);
for (int i = 0; i < roomNum; i++) {
room = new Room();
room.area = area;
room.windowNum = windowNum;
room.description = description;
rooms.add(room);
}
this.house.rooms = rooms;
return this;
}
/**
* 花园施工队,构建房子的花园
* */
public HouseBuilder buildGarden(double area,boolean hasSwimmingPool,String description) {
Garden garden = new Garden();
garden.area = area;
garden.hasSwimmingPool = hasSwimmingPool;
garden.description = description;
this.house.garden = garden;
return this;
}
/**
* 花园施工队,构建房子的花园
* */
public HouseBuilder buildBasement(double area,double hight,String description) {
Basement basement = new Basement();
basement.area = area;
basement.hight = hight;
basement.description = description;
this.house.basement = basement;
return this;
}
/**
* 验收,也就是生成最终产品
* */
public House createHouse() {
return this.house;
}
}
/**
* 销售员,可以可有可无,如果不用的话,那他的工作就是交给业务程序来做
* */
class Salesperson {
/**
* 原谅我的拼音,商品房
* */
public House shangPinLou() {
HouseBuilder houseBuilder = new HouseBuilder();
houseBuilder.buildBuilding(120, 1, "120平方的一层商品房,毛坯房")
.buildDoor(1.5, 2, "豪华大铁门一扇")
.buildRooms(20, 2, "3个20平方两窗户的大房间", 3);
House house = houseBuilder.createHouse();
house.description = "120平方的一层商品房,三室两厅,毛坯房";
return house;
}
/**
* 原谅我的拼音,商品房
* */
public House bieShu() {
HouseBuilder houseBuilder = new HouseBuilder();
houseBuilder.buildBuilding(400, 4, "400平方的5层大别墅,精装修")
.buildDoor(5, 2, "别墅专用铁栅栏门")
.buildRooms(60, 3, "5个60平带阳台豪华大房间", 5)
.buildBasement(100, 3, "100平3米高地下室")
.buildGarden(80, true, "80平带泳池大花园");
House house = houseBuilder.createHouse();
house.description = "400平方的5层大别墅,5室3厅,100平地下室,80平带泳池大花园,精装修,拎包入住";
return house;
}
}
设计模式--Builder生成器模式的更多相关文章
- Java设计模式-Builder生成器模式
概念: 生成器模式也称之为建造者模式.生成器模式的意图在于将一个复杂的构建与其表示相分离,构建与产品分离. UML: Ibuild接口清晰地反映了创建产品Product的流程. 生成器模式涉及4个关键 ...
- 每天一个设计模式-7 生成器模式(Builder)
每天一个设计模式-7 生成器模式(Builder) 一.实际问题 在讨论工厂方法模式的时候,提到了一个导出数据的应用框架,但是并没有涉及到导出数据的具体实现,这次通过生成器模式来简单实现导出成文本,X ...
- 设计模式03: Builder 生成器模式(创建型模式)
Builder生成器模式(创建型模式) Builder模式缘起假设创建游戏中的一个房屋House设施,该房屋的构建由几个部分组成,且各个部分富于变化.如果使用最直观的设计方法,每个房屋部分的变化,都将 ...
- 【设计模式】- 生成器模式(Builder)
生成器模式 建造者模式.Builder 生成器模式 也叫建造者模式,可以理解成可以分步骤创建一个复杂的对象.在该模式中允许你使用相同的创建代码生成不同类型和形式的对象. 生成器的结构模式 生成器(Bu ...
- 设计模式(二): BUILDER生成器模式 -- 创建型模式
1.定义 将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式. 2.适用场景 1. 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式 ...
- 面向对象设计模式_生成器模式详解(Builder Pattern)
首先提出一个很容易想到应用场景: 手机的生产过程:手机有非常多的子件(部件),成千上万,不同品牌的手机的生产过程都是复杂而有所区别的,相同品牌的手机在设计上也因客户需求多样化,大到型号,小到颜色,是否 ...
- 设计模式十: 生成器模式(Builder Pattern)
简介 生成器模式属于创建型模式的一种, 又叫建造者模式. 生成器模式涉及4个关键角色:产品(Product),抽象生成器(builder),具体生成器(ConcreteBuilder),指挥者(Dir ...
- 面向对象设计模式_生成器模式解读(Builder Pattern)
首先提出一个很容易想到应用场景: 手机的生产过程:手机有非常多的子件(部件),成千上万,不同品牌的手机的生产过程都是复杂而有所区别的,相同品牌的手机在设计上也因客户需求多样化,大到型号,小到颜色,是否 ...
- Java设计模式:生成器模式
问题的提出: 有些类很容易创建对象,直接调用其构造方法,例如Student student = new Student("1001","zhang",21); ...
随机推荐
- 小谢第1问:为什么要写blog
一直犹豫了好久,终于在csdn上弄好了自己的博客账号,感谢平台,以后在工作的过程中,遇到不懂得问题,解决后,会在这里记录下自己所遇到的问题
- 爱奇艺|B站|优酷|腾讯视频高清无水印视频下载方法(软件工具教程)
导读:经常在大型视频网站平台上看到一些很价值和视频,希望能高清无水印下载到本地学习观看,今天小程序定制开发代码哥DaiMaGe6给大家分享一招免费下载全网高清无水印视频的方法. 高清无水印视频下载工具 ...
- js函数prototype属性学习(一)
W3school上针对prototype属性是这么给出定义和用法的:使您有能力向对象添加属性和方法.再看w3school上给的那个实例,如下图: 仔细一看,原来最基本的作用就是对某些对象的属性.方法来 ...
- 分布式事务专题笔记(二)分布式事务解决方案之 2PC(两阶段提交)
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 前面已经了解了分布式事务的基础理论,以理论为基础,针对不同的分布式场景业界常见的解决方案有2PC.TCC ...
- Java实现选号码
选号码 Description CF打算换个手机号码,但是他去营业厅选号码的时候却把移动的客服小姐烦得不行,因为他太挑三捡四啦. 对于一个手机号的后六位数字(前面五位他就无所谓了)CF有很严格的要求, ...
- Java实现 LeetCode 129 求根到叶子节点数字之和
129. 求根到叶子节点数字之和 给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字. 例如,从根到叶子节点路径 1->2->3 代表数字 12 ...
- node实现图片分割
前言 最近,女王大大日常找我弄图片,本来之前我一直是ps帮他弄得,后来- -,ps不能分割过长的图片,我就想想能不能通过代码来帮他实现好了. 经过我在npm搜索一番,发现没有一个纯代码层面的high ...
- mac 排查被占端口
Last login: Wed Sep :: on ttys000 sam:~ sam$ sudo lsof -i : Password: COMMAND PID USER FD TYPE DEVIC ...
- 解决Celery 在Windows中搭建和使用的版本
官网:http://docs.celeryproject.org/en/latest/faq.html#does-celery-support-windows 描述如下:表示Celery 4.0版本以 ...
- PHP上传进度支持(Upload progress in sessions)
文件上传进度反馈, 这个需求在当前是越来越普遍, 比如大附件邮件. 在PHP5.4以前, 我们可以通过APC提供的功能来实现. 或者使用PECL扩展uploadprogress来实现. 从PHP的角度 ...