java设计模式3——建造者模式
1、建造者模式介绍:
建造者模式属于创建型模式,他提供了一种创建对象得最佳方式
定义:
将一个复杂对象的构建和与它的表示分离,使得同样的构建过程可以创建不同的表示
主要作用:
- 用户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象
- 用户只需要给出指定复杂对象的类型和内容,建造者模式负责按顺序创建复杂的对象(把内部的建造过程和细节隐藏了起来)
举例:
2、建造者模式角色分析
3、方式一:建造模式的常规用法(有指挥)
3.1、构建抽象的建造者(图纸)
package com.xgp.company.第三种_建造者模式.常规用法_套餐用法;
/**
- 抽象的建造者
*/
public abstract class Builder {
abstract void buildA(); //地基
abstract void buildB(); //钢筋水泥
abstract void buildC(); //铺电线
abstract void buildD(); //粉刷
//完工:等到产品
abstract Product getProduct();
}
3.2、定义产品(房子)
package com.xgp.company.第三种_建造者模式.常规用法_套餐用法;
//产品:房子
public class Product {
private String buildA;
private String buildB;
private String buildC;
private String buildD;
public String getBuildA() {
return buildA;
}
public void setBuildA(String buildA) {
this.buildA = buildA;
}
public String getBuildB() {
return buildB;
}
public void setBuildB(String buildB) {
this.buildB = buildB;
}
public String getBuildC() {
return buildC;
}
public void setBuildC(String buildC) {
this.buildC = buildC;
}
public String getBuildD() {
return buildD;
}
public void setBuildD(String buildD) {
this.buildD = buildD;
}
@Override
public String toString() {
return "Product{" +
"buildA='" + buildA + '\'' +
", buildB='" + buildB + '\'' +
", buildC='" + buildC + '\'' +
", buildD='" + buildD + '\'' +
'}';
}
}
3.3、定义具体的建造者(工人)
package com.xgp.company.第三种_建造者模式.常规用法_套餐用法;
//具体的建造者
public class Worker extends Builder {
private Product product;
public Worker() {
product = new Product();
}
@Override
void buildA() {
product.setBuildA("铺地基");
System.out.println("铺地基");
}
@Override
void buildB() {
product.setBuildB("搭钢筋");
System.out.println("搭钢筋");
}
@Override
void buildC() {
product.setBuildC("铺电线");
System.out.println("铺电线");
}
@Override
void buildD() {
product.setBuildD("粉刷墙壁");
System.out.println("粉刷墙壁");
}
@Override
Product getProduct() {
return product;
}
}
3.4、定义指挥者,指挥工人建造
package com.xgp.company.第三种_建造者模式.常规用法_套餐用法;
/**
- 指挥:核心,负责指挥构建一个工程,工程如何构建,由他来决定
*/
public class Director {
//指挥工人创建房子
public Product build(Builder builder) {
//创建产品
builder.buildA();
builder.buildB();
builder.buildC();
builder.buildD();
return builder.getProduct();
}
}
3.5、创建测试类,进行建造
package com.xgp.company.第三种_建造者模式.常规用法_套餐用法;
public class Test {
public static void main(String[] args) {
//指挥
Director director = new Director();
//指挥具体的工人完成创建
Product build = director.build(new Worker());
System.out.println(build.toString());
}
}
结果:
铺地基
搭钢筋
铺电线
粉刷墙壁
Product{buildA='铺地基', buildB='搭钢筋', buildC='铺电线', buildD='粉刷墙壁'}
4、方式二:用户可以自定义套餐和选择默认套餐(没有指挥者)
4.1、定义抽象的建造者
package com.xgp.company.第三种_建造者模式.通过静态内部类来实现;
/**
- 抽象的建造者
*/
public abstract class Builder {
abstract Builder buildA(String msg); //汉堡
abstract Builder buildB(String msg); //可乐
abstract Builder buildC(String msg); //薯条
abstract Builder buildD(String msg); //甜点
//完工:得到产品
abstract Product getProduct();
}
4.2、定义产品和默认套餐
package com.xgp.company.第三种_建造者模式.通过静态内部类来实现;
/**
- 套餐
*/
public class Product {
//默认套餐
private String buildA = "汉堡";
private String buildB = "可乐";
private String buildC = "薯条";
private String buildD = "甜点";
public String getBuildA() {
return buildA;
}
public void setBuildA(String buildA) {
this.buildA = buildA;
}
public String getBuildB() {
return buildB;
}
public void setBuildB(String buildB) {
this.buildB = buildB;
}
public String getBuildC() {
return buildC;
}
public void setBuildC(String buildC) {
this.buildC = buildC;
}
public String getBuildD() {
return buildD;
}
public void setBuildD(String buildD) {
this.buildD = buildD;
}
@Override
public String toString() {
return "Product{" +
"buildA='" + buildA + ''' +
", buildB='" + buildB + ''' +
", buildC='" + buildC + ''' +
", buildD='" + buildD + ''' +
'}';
}
}
4.3、定义具体的建造者(服务员)
package com.xgp.company.第三种_建造者模式.通过静态内部类来实现;
//具体的建造者
public class Worker extends Builder {
private Product product;
public Worker() {
product = new Product();
}
@Override
Builder buildA(String msg) {
product.setBuildA(msg);
return this;
}
@Override
Builder buildB(String msg) {
product.setBuildB(msg);
return this;
}
@Override
Builder buildC(String msg) {
product.setBuildC(msg);
return this;
}
@Override
Builder buildD(String msg) {
product.setBuildD(msg);
return this;
}
@Override
Product getProduct() {
return product;
}
}
4.4、定义顾客,进行点餐
package com.xgp.company.第三种_建造者模式.通过静态内部类来实现;
public class Test {
public static void main(String[] args) {
//服务员
Worker worker = new Worker();
Product product = worker.getProduct();
System.out.println(product.toString());
//自定义套餐
product = worker.buildA("aaa").buildB("bbb").buildC("cccc").buildD("ddd").getProduct();
System.out.println(product.toString());
}
}
运行结果:
Product{buildA='汉堡', buildB='可乐', buildC='薯条', buildD='甜点'}
Product{buildA='aaa', buildB='bbb', buildC='cccc', buildD='ddd'}
5、优点分析:
6、缺点分析:
7、应用场景:
8、建造者模式与抽象工厂模式的比较
java设计模式3——建造者模式的更多相关文章
-
折腾Java设计模式之建造者模式
博文原址:折腾Java设计模式之建造者模式 建造者模式 Separate the construction of a complex object from its representation, a ...
-
Java 设计模式之建造者模式(四)
原文地址:Java 设计模式之建造者模式(四) 博客地址:http://www.extlight.com 一.前言 今天继续介绍 Java 设计模式中的创建型模式--建造者模式.上篇设计模式的主题为 ...
-
Java设计模式之建造者模式(Builder)
前言: 最近一直在学习okHttp,也对其做了一些整理,okHttp和Retrofit结合大大加速我们的开发效率,源码里面采用了很多设计模式,今天我们来学习一下其中的设计模式之一建造者模式. 建造者模 ...
-
Java设计模式之三 ----- 建造者模式和原型模式
前言 在上一篇中我们学习了工厂模式,介绍了简单工厂模式.工厂方法和抽象工厂模式.本篇则介绍设计模式中属于创建型模式的建造者模式和原型模式. 建造者模式 简介 建造者模式是属于创建型模式.建造者模式使用 ...
-
Java设计模式之三建造者模式和原型模式
建造者模式 简介 建造者模式是属于创建型模式.建造者模式使用多个简单的对象一步一步构建成一个复杂的对象.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式.简单的来说就是将一个复杂的东西 ...
-
java设计模式之建造者模式
学习了设计模式,一直感觉有进步又没有进步,与同学.同事探讨了一下.变化不可能一会就可以的,需要努力坚持.不管进步大小,也不管是否进步,做到勿忘初心,做自己喜欢的事情就好.还有几个设计模式一直没有写,原 ...
-
java设计模式之四建造者模式(Builder)
工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象,所谓复合对象就是指某个类具有不同的属性,其实建造者模式就是前面抽象工厂模式和最后的Test结合起来得到 ...
-
java设计模式3.建造者模式、原型模式
建造者模式 一个产品常有不同的组成部分作为产品的零件,有些情况下,一个对象会有一些重要的性质,在它们没有恰当的值之前,对象不能作为一个完整的产品使用,有些时候,一个对象的一些性质必须按照某个顺序赋值才 ...
-
Java设计模式之建造者模式(生成器模式)
建造者模式: 也叫生成器模式.用来隐藏复合对象的创建过程,他把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象. 总结一句就是封装一个对象的构造过程,并允许按步骤构造 ...
随机推荐
-
SSH原理与运用
SSH是每一台Linux电脑的标准配置. 随着Linux设备从电脑逐渐扩展到手机.外设和家用电器,SSH的使用范围也越来越广.不仅程序员离不开它,很多普通用户也每天使用. SSH具备多种功能,可以用于 ...
-
深入理解 GCD
前言 首先提出一些问题: dispatch_async 函数如何实现,分发到主队列和全局队列有什么区别,一定会新建线程执行任务么? dispatch_sync 函数如何实现,为什么说 GCD 死锁是队 ...
-
JDBC之数据库操作
JDBC重要界面有: java.sgl.DriverManager:完成驱动程序的装载和建立新的数据库连接. java.sgl.Connection:表示对某一指定数据库的连接. java.sgl.S ...
-
node.js中的文件系统
文件打开操作 fs.open(path, flags[, mode], callback) path: <string>|<Buffer>|<URL> flags: ...
-
line-height 设置为 1
https://*.com/questions/1000398/what-is-line-height1 If no unit is supplied e.g. " ...
-
如何在Virtual box 下安装Mac os
这几天,突然奇想,想要试一试Mac os ,毕竟是贵族系统,装完之后,确实感觉字体很不错. 其他更优秀的功能还没发现,不过,还是希望在这里做一个记录. 以下附录我参照的网址:https://blog ...
-
微信小程序发起微信支付
点击链接查看详情:(支付中配置参数需要从后台得到->签名需要从微信申请才可以得到) https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-pay.h ...
-
微软Power BI 每月功能更新系列——3月Power BI 新功能学习
本月对Power BI Desktop 来讲是非常令人兴奋的一个月!!!以下是3月份最新的功能,下面马上带领大家看看本月的更新内容. 报表功能 报告页面工具提示(预览) 通过报告页面工具提示功能,可 ...
-
JavaScript -- Window-框架
-----025-Window-框架.html----- <!DOCTYPE html> <html> <head> <meta http-equiv=&qu ...
-
SwipeRefreshLayout嵌套ScrollView实现下拉刷新
API doc:http://developer.android.com/reference/android/support/v4/widget/SwipeRefreshLayout.html 首先须 ...