建造者模式java_java设计模式3——建造者模式
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_java设计模式3——建造者模式相关推荐
- 工厂模式 java_JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)
在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一 ...
- 访问者模式 java_java设计模式之访问者模式
写这篇文章之前,我也看了十几篇网络大牛写的访问者设计模式的文章,都说这个访问者模式是最复杂的一个,但是我觉得跟其他的设计模式并没有太多的不同,因此自己整理了一下,相信大多数人都能看懂. 一.认识访问者 ...
- 组合模式 桥接模式 java_java设计模式5.组合模式、门面模式、享元模式、桥接模式...
组合模式 在面向对象的语言中,树结构有着巨大的威力,一个基于继承的类型的等级结构便是一个数结构,一个基于合成的对象结构也是一个数结构.组合模式将部分与整体的关系用树结构表示出来,使得客户端把一个个单独 ...
- facade java_Java设计模式之Facade模式
Java设计模式之Facade模式 GOF<设计模式>一书对Facade模式是这样描述的: 为子系统中的一组接口提供一个统一接口.Facade模式定义了一个更高层的接口,使子系统更加容易 ...
- 调停者模式 java_JAVA设计模式之调停者模式详解
在阎宏博士的<JAVA与模式>一书中开头是这样描述调停者(Mediator)模式的: 调停者模式是对象的行为模式.调停者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显引用.从 ...
- Java创新型模式_java设计模式--创建型模式(一)
2016-04-24 10:10:34 创建型模式:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式 注意:工厂模式可以分为三类: 1)简单工厂模式(Simple Factory) 2)工厂 ...
- python的编程模式-Python设计模式之状态模式原理与用法详解
本文实例讲述了Python设计模式之状态模式原理与用法.分享给大家供大家参考,具体如下: 状态模式(State Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类 ...
- python工厂模式 django_python设计模式-工厂方法模式
题目:假设你有一个 pizza 店,功能包括下订单.做 pizza,你的代码会如何写呢? def order_pizza(): pizza = Pizza() pizza.prepare() pizz ...
- python 命令模式_python 设计模式之命令模式
命令模式介绍: 在面向对象编程中,命令模式是概括所有方法信息的设计模式. 此模式对象包涵方法名,及其相关参数值. 命令模式是一个分类的观察者设计模式,在命令模式下,对象被概括为一个命令表单,此表单包涵 ...
最新文章
- MySQL 学习笔记(9)— 事务控制语句、事务属性以及并发和隔离级别
- 计算机原理与基础 —— 进制之间的转换(二进制与十、八、十六禁止之间的转换)
- 南邮CTF-MISC-Remove Boyfriend
- Error Handling in ASP.NET Core
- 毕设日志——tensorboardX无法连接的问题
- 在Eclipse下出现dobbo索引错误,解决方案
- Altium designer-PCB设计基础笔记
- 软件智能:aaas系统中AI众生的“世”和“界” 之8-神经系统的假设assumption
- 2017暑期实习招聘-产品经理-微软WDGAE(1)-2轮面试
- 小样儿老师:我的嵌入式学习之路(一)
- 斯坦福公布3D街景数据集:2500万张图像,8个城市模型 | 下载
- 线性回归2020年天猫双十一销量
- 访问localhsot:8080需要密码
- 38. OP-TEE中secure stroage------安全文件数据格式和操作过程
- 如何在U-Boot中添加自定义命令
- 【微机原理与接口技术】之一微型计算机系统概述
- 为什么双赞安卓ARM工控主板应用前景那么好?
- JDBC——“CRUD”
- 为什么专业领域里外行领导能让墙倒屋塌?
- 代替塞规的高精度孔径测量方法——泊肃叶压差法