概览与建造者builder(创建型 一)
设计模式概览
设计模式有20多种,一般可以分为三类,我更愿意从 面向对象 的角度对设计模式进行分类
面向对象
首先要创建对象,那么有--------创建型
创建了一堆对象,怎么处理对象与对象之间的关系--------行为型
最后对象继承或者实现类、接口,怎么处理类与类与接口之间的关系---------结构型
不多提,直接进入正题
创建型
首先考虑对象的创建,考虑下面几种情况
创建:
一个对象
一个复杂对象(比如包含100个属性)
N个对象
一组有关联的对象
N组有关联的对象
一个独一无二的对象
考虑上面几种情况,怎么满足开闭原则,怎么创建的更优雅??
(1)一个对象
略,每种语言都有创建对象的语法,java是调用构造器,不多提
(2)一个复杂对象
举个例子,我想创建一支笔(题外话 笔这个对象在现实中就是一个实体,看得见摸得着;在计算机世界,其实本质就是 一段放在存储介质上的010101,这些0101描述了这个对象的样子(属性) )
不多提,笔的这个对象有很多属性,比如长、宽、高、笔芯、墨水、外壳形状、弹簧,甚至笔套······
java中常规创建方式可能就是`
new Pen(length, width, height, ink, ··············
但是考虑一个问题,如果创建这个笔我不知道高度怎么办,下次创建不知道宽度怎么办,下次不知道长度············
每次创建总是缺那么一些,ok当然可以用构造器
new Pen(null, width, height, null·····
new Pen(length, null, height, null, ··············
new Pen((null, width, height, null, ··············
但是总归不够优雅,考虑出现100个参数 50个不知道的情况,代码味道很怪
那么考虑下怎么更优雅
是不是我有几个,我就写几个,其他没有的就不用写啊
也就是说 要把每个属性的创建进行分离,然后有几个创建几个
于是考虑下面这种写法
Pen pen = new Pen();
pen.setLength(length);
pen.setWidth(width);
···
这么写行不行,当然也ok,但是有没有更优雅的写法,我就是想用构造器一把创建了,不想去赋值
那么建造者模式builder来了,为每个属性创建一个builder
代码简单演示一下
1 创建一个PenBO类,
2 然后在类中定义一个内部类PenBOBuilder,持有一个pen对象
3 PenBOBuilder中为每个属性建立一个buider方法,
注意属性builder的返回值是PenBOBuilder,为了可以写链式编程,见main中写法
最后有个build方法,返回pen
public class PenBO {private int h;private int w;private int l;private int ink;static class PenBOBuilder {PenBO pen = new PenBO();public PenBOBuilder hBuilder(int h) {pen.h = h;return this;}public PenBOBuilder wBuilder(int w) {pen.w = w;return this;}public PenBOBuilder lBuilder(int l) {pen.l = l;return this;}public PenBOBuilder inkBuilder(int ink) {pen.ink = ink;return this;}public PenBO build() {return pen;}}public static void main(String[] args) {PenBO.PenBOBuilder penBuilder = new PenBO.PenBOBuilder();penBuilder.hBuilder(1).wBuilder(2).lBuilder(3).inkBuilder(4);PenBO pen1 = penBuilder.build();System.out.print(pen1.h);System.out.print(pen1.w);System.out.print(pen1.l);System.out.println(pen1.ink);PenBO.PenBOBuilder penBuilder2 = new PenBO.PenBOBuilder();penBuilder2.hBuilder(1).inkBuilder(4);PenBO pen2 = penBuilder2.build();System.out.print(pen2.h);System.out.print(pen2.w);System.out.print(pen2.l);System.out.print(pen2.ink);}
}
最终返回
1234
1004
pen1有4个属性值,pen2只有2个
这么写,相当的灵活
实际应用
可能会碰到一个非常复杂的BO类,BO套BO再套BO,还把builder都写在一个文件里,但是没关系,都是builder模式
一般来说 两个服务直接通信,定义好了接口,有哪些字段,直接可以写进一个完整BO类,大家都使用这个BO类去构建对象,还是比较方便的。
另外可以写一个工具,把定义好的BO转换成带builder的BO类,也可以方便修改
当然也可以定义接口把builder独立出来写,这样结构更清晰,也比较然后扩展
概览与建造者builder(创建型 一)相关推荐
- C++设计模式之建造者模式(builder)(创建型)
软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径.设计模式中运用了面向对象编程语言的重要特性:封装.继承.多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累. ...
- 设计模式(创建型)之建造者模式(Builder Pattern)
PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbob ...
- 建造者模式与原型模式/builder模式与prototype模式/创建型模式
建造者模式 定义 用于简化复杂对象的创建 JDK中的建造者模式 java.lang.StringBuilder中的append()方法,每次调用后返回修改后的对象本身. public StringBu ...
- 建造者模式(Builder)---创建型
1 定义域特征 定义:将一个复杂的对象构建与其表示分离,使得同样的构建过程可以创建不同的表示.特征:用户只需要指定需要建造的类型即可,对于中间的细节不考虑. 本质:分离整体构建算法和部件构造.构建一个 ...
- 建造者模式(Builder Pattern)【创建型】
一.引言 今天我们要讲讲Builder模式,也就是建造者模式,当然也有叫生成器模式的,英文名称是Builder Pattern.在现实生活中,我们经常会遇到一些构成比较复杂的物品,比如:电脑,它就是一 ...
- java设计模式中不属于创建型模式_Java设计模式(5)——创建型模式之建造者模式(Builder)...
一.概述 概念 将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示.(与工厂类不同的是它用于创建复合对象) UML图 主要角色 抽象建造者(Builder)--规范建造方法与结果返还 ...
- D5:C#设计模式之四建造者模式(Builder Pattern)【创建型】
一.引言 今天我们要讲讲Builder模式,也就是建造者模式,当然也有叫生成器模式的,英文名称是Builder Pattern.在现实生活中,我们经常会遇到一些构成比较复杂的物品,比如:电脑,它就是一 ...
- 四:轻松学设计模式:创建型、结构型、行为型概览
在软件开发的世界中,有一个众所周知的词汇--设计模式.设计模式是一种解决特定问题的优雅方案,代码让人看起来就有种自然的感觉.现在,我们就来轻松.幽默地了解一下这些神秘的设计模式吧! 创建型(Creat ...
- 设计模式-创建型模式-建造者模式
设计模式-创建型模式-建造者模式 建造者模式即生成器模式,将一个复杂的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 代码如下 // 产品类 public class Product{pu ...
最新文章
- PHP框架中的日志系统
- mysql两列数据去重_CiteSpace多数据库一键去重4.0-知网、万方、维普数据库
- springmvc 全局编码_SpringMVC-设置UTF-8编码
- ES6_入门(3)_顶层对象属性
- 什么是 restful api
- STM32三种启动模式 boot0 boot1
- 【转载保存】Jsoup使用
- 原linux的字符文件作用,linux特殊字符及其作用大全
- Excel导入到sql数据库中完整代码
- python中的readalllines用法_什么是最好的编程语言?(怎样才能爱上编程呢?)
- 网络编程之 listen()函数的使用与三次握手的理解
- javamall 3.0 mysql_Java数据类型与MySQL数据类型对照表
- 暴力/set Codeforces Round #291 (Div. 2) C. Watto and Mechanism
- NLPIR词性标记集
- python数字图像处理——边缘检测算子(Laplacian算子、Roberts算子、Prewitt算子和Sobel算子)
- springboot报错:Use of @OneToMany or @ManyToMany targeting an unmapped class:
- 查看已有的docker镜像latest的具体版本号
- uni-app开发App上架Apple Store流程(简略版)
- Acer TravelMateP249主板上最容易被人忽略的問題
- leetcode账号手机号换绑