《Java设计模式》之构建者模式
构造者模式(Builder Pattern):构造者模式将一个复杂对象的构造过程和它的表现层分离开来。使得相同的构建过程能够创建不同的表示,又称为生成器模式。
Builder模式 主要用于“构建一个复杂的对象”。
把复杂对象的创建过程加以抽象,通过子类继承和重写方法。来得到具有复合属性的对象。
同一时候为了统一创建过程,把对象的创建操作统一封装到Director的方法中。
因为一个复杂对象的单个属性可能会发生变化(比如:制造汽车时使用的某一部件属于不同的厂家)可是整个复杂对象的构建过程却不会发生变化(比如:汽车的构建图纸已经固定,仅仅须要把部件依照图纸装配好)
GOF:讲一个复杂对象的构建与其表示相分离,使得同样的构建过程能够创建不同的表示。即构建过程同样,可是子部件却不同样。
适用性:
1.当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
2.当构造过程必须同意被构造的对象有不同的表示时。
结构图(Struct):
生活中的样例:
import java.util.ArrayList;
抽象的创建者类。主要给详细的创建者类创建模板。详细的创建者继承该类后,重写方法。用自己的方式创建风格不同的复杂对象的属性。但整体复杂对象的结构已经固定。
abstract class Builder{
public abstract void BuildDoor();
public abstract void BuildWall();
public abstract void BuildWindows();
public abstract void BuildHouseCeiling();
public abstract House GetHouse();
}
具有复杂属性的对象。
class House{
private ArrayList <String>parts=new ArrayList<String>();
public void add(String str){
parts.add(str);
}
public void show()
{
for(String part:parts)
{
System.out.println(part+"\t");
}
System.out.println("\n");
} }
统一创建的过程。将创建过程统一。也能够有详细的流程
class Director{
public void construct(Builder builder){
builder.BuildDoor();
builder.BuildWall();
builder.BuildWindows();
builder.BuildHouseCeiling();
}
}
详细的创建者类,负责创建具有不同表示的复杂对象
class ChineseBuilder extends Builder{
private House chineseHouse=new House();
public void BuildDoor() {
chineseHouse.add("ChineseDoor");
}
public void BuildWall() {
chineseHouse.add("ChineseWall");
}
public void BuildWindows() {
chineseHouse.add("ChineseWindows");
}
public void BuildHouseCeiling() {
chineseHouse.add("ChineseHouserCeiling");
}
public House GetHouse() {
return chineseHouse;
} } class EnglandBuilder extends Builder{
private House englandHouse=new House();
public void BuildDoor() {
englandHouse.add("EnglandDoor");
}
public void BuildWall() {
englandHouse.add("EnglandWall");
}
public void BuildWindows() {
englandHouse.add("EnglandWindows");
}
public void BuildHouseCeiling() {
englandHouse.add("EnglandHouserCeiling");
}
public House GetHouse() {
return englandHouse;
} }
public class BuilderPattern {
public static void main(String[] args) {
Builder chineseBuilder=new ChineseBuilder();
Builder englandBuilder=new EnglandBuilder();
Director director=new Director();
director.construct(chineseBuilder);
House chineseHouse=chineseBuilder.GetHouse();
chineseHouse.show();
director.construct(englandBuilder);
House englandHouse=englandBuilder.GetHouse();
englandHouse.show();
} }
在这里转贴一下这位 forumID=125&threadID=28019&messageID=241582" style="text-decoration:none; color:rgb(8,68,135); font-family:simsun; font-size:14px; line-height:21px; background-color:rgb(235,235,235)">richardluo的比喻
简单地说,就好象我要一座房子住,但是我不知道怎么盖(简单的砌墙。层次较低),也不知道怎么样设计(建几个房间,几个门好看,层次较高),于是我须要找一帮民工。他们会砌墙。还得找个设计师,他知道怎么设计,我还要确保民工听设计师的领导。而设计师本身也不干活,光是下命令,这里砌一堵墙,这里砌一扇门。这样民工開始建设,最后,我能够向民工要房子了。在这个过程中,设计师是什么也没有。除了他在脑子里的设计和命令,所以要房子也是跟民工要,记住了!
下面是richardluo的代码,我依据他的思路加上了对应的凝视。
1,定义工人接口,就是可以完毕建造房子任务的人的通用要求。
- // 工人接口。定义了各个工人所要进行的工所作。
他们负责进行详细部件如窗户。地板的建造。
- // 同一时候由于房子是民工建的,因此建设完毕后由他把房子递交回房主
- public interface Builder {
- public void makeWindow();
- public void makeFloor();
- public Room getRoom();
- }
2,定义设计师。他的职责是指挥房主指派给他的工人依照自己的设计意图建造房子。
- // 设计师。他知道房子应该怎么设计,但他不会自己去建造,而是指挥民工去建造。
- public class Designer {
- // 指挥民工进行工作
- public void order(Builder builder) {
- builder.makeWindow();
- builder.makeFloor();
- }
- }
3,民工,他负责详细事物的实施。
- // 民工。负责进行详细部件如窗户,地板的建造。
- //同一时候由于房子是民工建的,因此建设完毕后由他把房子递交回房主
- public class Mingong implements Builder {
- private String window="";
- private String floor="";
- public void makeWindow() {
- window=new String("window");
- }
- public void makeFloor(){
- floor=new String("floor");
- }
- // 回交房子给房主
- public Room getRoom() {
- if((!window.equals(""))&&(!floor.equals(""))) {
- System.out.println("room ready!");
- return new Room();
- }
- else return null;
- }
- }
4,房主,就是雇人,收房。
- // 房主。房主的任务就是聘请一个民工,一个设计师,同一时候把民工给设计师指挥,督促设计师开展工作。
最后从民工手上收房。
- public class Client {
- public static void main(String[] args) {
- Builder mingong = new Mingong();
- Designer designer = new Designer();
- designer.order(mingong);
- mingong.getRoom();
- }
- }
本文借鉴:http://blog.csdn.net/jiafu1115/article/details/6668563
http://luchar.iteye.com/blog/179619
http://blog.sina.com.cn/s/blog_66f2257c0100i9yi.html
《Java设计模式》之构建者模式的更多相关文章
- 深入探索Java设计模式之构建器模式(五)
抽丝剥茧 细说架构那些事——[优锐课] 简单的程序不需要大量的设计过程,因为它们只关注有限的解决方案,仅使用几个类.大型程序专注于广泛的设计,该设计比好的设计范例的任何其他属性都更能利用可重用性.宏伟 ...
- Java设计模式之《桥接模式》及应用场景
摘要: 原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/6497919.html 这里摘抄一份他处的概念,你可以不必理会,先看下面得讲解与实例, ...
- Java设计模式之《外观模式》及应用场景
原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/6484128.html 1.外观模式简介 外观模式,一般用在子系统与访问之间,用于对访问屏蔽复 ...
- Java设计模式之《代理模式》及应用场景
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6525527.html 代理模式算是我接触较早的模式,代理就是中介,中间人.法律上也有代理, ...
- Java设计模式系列-抽象工厂模式
原创文章,转载请标注出处:https://www.cnblogs.com/V1haoge/p/10755412.html 一.概述 抽象工厂模式是对工厂方法模式的再升级,但是二者面对的场景稍显差别. ...
- Java设计模式系列-工厂方法模式
原创文章,转载请标注出处:<Java设计模式系列-工厂方法模式> 一.概述 工厂,就是生产产品的地方. 在Java设计模式中使用工厂的概念,那就是生成对象的地方了. 本来直接就能创建的对象 ...
- Java设计模式系列-装饰器模式
原创文章,转载请标注出处:<Java设计模式系列-装饰器模式> 一.概述 装饰器模式作用是针对目标方法进行增强,提供新的功能或者额外的功能. 不同于适配器模式和桥接模式,装饰器模式涉及的是 ...
- Java设计模式之《模板模式》及使用场景
原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9558825.html 模板模式,顾名思义,就是通过模板拓印的方式. 定义模板,就是定义框 ...
- java设计模式4--建造者模式(Builder)
本文地址:http://www.cnblogs.com/archimedes/p/java-builder-pattern.html,转载请注明源地址. 建造者模式 将一个复杂对象的构建与它的表示分离 ...
- 重学 Java 设计模式:实战外观模式「基于SpringBoot开发门面模式中间件,统一控制接口白名单场景」
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 你感受到的容易,一定有人为你承担不容易 这句话更像是描述生活的,许许多多的磕磕绊绊总 ...
随机推荐
- java 仓库maven
工具: apache-maven-3.2.3.zip maven_data.zip 在java Window->Preferences->Maven中 Installations中添加ap ...
- 只用一次循环开销 将类似 1 A 、1 B 的数据返回成为 1 A,B 的拼接形式
/// <summary> ///将类似 1 A .1 B 的数据返回成为 1 A,B 的拼接形式 /// </summary> /// <param name=&quo ...
- DB2 With语句递归
WITH T1 (T11 , T22 , T33 , T44) AS (SELECT TASKID , REPLY , ROWNUMBER () OVER (PARTITION BY TASKID) ...
- iOS YYYY 和 yyyy的区别
2017年1月31日 转换后变成 2018年1月31日,相差一年.这是为什么呢? 原因:YYYY 是以周为单位计算的,我们平常计算日期时最好用yyyy,yyyy才是标注的年份 如果一月1日是星期一,星 ...
- UVA - 294 Divisors【数论/区间内约数最多的数的约数个数】
Mathematicians love all sorts of odd properties of numbers. For instance, they consider to be an int ...
- centos 7 mysql 离线安装教程
1. 解压下载的zip包,会发现有以下几个rpm包: MySQL-client-advanced-5.6.22-1.el7.x86_64.rpm MySQL-devel-advanced-5.6.22 ...
- 牛客网暑期ACM多校训练营 记录
所有牛客多校的做题记录请右转队伍wiki Name Date Rank 2018 Multi-University,Nowcoder Day 1 2018.7.19 16/338 5/10 https ...
- 2017省选集训测试赛(二十五)Problem B recollection
@(XSY)[后缀数组, 启发式合并, ST表] Description Solution 后缀数组 + 启发式合并 + Sparse Table. 这是第一次写树上后缀数组. 对以每个点为根的子树统 ...
- MySQL复制表结构和内容到另一张表(转)
MySQL不要看它小,一个开源的产物,要学习它的东西真的很多.而它的一切是SQL Server无法比拟的. 复制表结构及数据到新表 create table 新表 select * from 旧表 只 ...
- [js]数组栈和队列操作
写在前面 在项目中,对数组的操作还是比较常见的,有时候,我们需要模拟栈和队列的特性才能实现需求,这里记录一下这个知识点. 栈 栈(stack)又名堆栈,它是一种运算受限的线性表.其限制是仅允许在表的一 ...