建造者模式是非常常用的一种设计模式,安卓原生的比如StringBuilder、Dialog就是用的这种设计模式。如果满足以下条件的时候可以考虑使用这种设计模式:

1、用来创建一个对象而这个对象是由各种属性组成,创建步骤繁琐。

2、对象的创建过程独立于创建该对象的类。

3、隔离复杂对象的创建和使用,使得相同的创建过程能创建出不同的产品。

该模式的定义为:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

一般该模式有下面4种角色:

product:需要创建的产品

builder:抽象的接口

concretebuilder:具体的接口类,提供一个方法用来创建product对象

director:用来指挥创建,一般用客户端代替

下面就来用一个生产手机的例子来教大家使用这种模式,我们生产一个手机需要有手机的产品名称,屏幕的材质,大小,cup型号,电池容量等。其实我们不想要抽象接口也能设计出这个demo,不过为了提高程序的可扩展性和低耦合,还是希望大家按照正常的流程走,这样你设计的程序才可以更健壮。

我们先来看下效果图:

布局文件很简单就不提供了,我们先来看看我们的产品类:

public class Phone {String battery, cup, screen, size,brand;public void setBattery(String battery) {this.battery = battery;}public void setBrand(String brand) {this.brand = brand;}public void setCup(String cup) {this.cup = cup;}public void setScreen(String screen) {this.screen = screen;}public void setSize(String size) {this.size = size;}
}

只有一些属性和set方法,很简单,下面来看抽象的builder接口:

public interface PhoneBuilder {PhoneBuilder setCup(String cup);PhoneBuilder setScreen(String material);PhoneBuilder setSize(String size);PhoneBuilder setBattery(String battery);PhoneBuilder setBrand(String brand);Phone create();
}

也是很简单,只有一些set方法和一个创建产品的create方法,下面看具体接口类:

public class ConcreteBuilder implements PhoneBuilder {private Phone phone = new Phone();@Overridepublic ConcreteBuilder setCup(String cup) {phone.cup = cup;return this;}@Overridepublic ConcreteBuilder setScreen(String material) {phone.screen = material;return this;}@Overridepublic ConcreteBuilder setSize(String size) {phone.size = size;return this;}@Overridepublic ConcreteBuilder setBattery(String battery) {phone.battery = battery;return this;}@Overridepublic PhoneBuilder setBrand(String brand) {phone.brand = brand;return this;}public Phone create() {return phone;}}

实现抽象接口,里面有一个属性是产品类,在create方法里面返回产品类,这些代码都是简单的不需要加注释,最后来看Activity类:

public class MainActivity extends AppCompatActivity {StringBuilder sb = new StringBuilder();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}public void saling(View view) {ConcreteBuilder iphoneBuilder = new ConcreteBuilder();Phone phone = iphoneBuilder.setSize("5.7英寸").setScreen("AMOLED").setBattery("3000毫安").setCup("骁龙820").setBrand("苹果7").create();sb.append("品牌:" + phone.brand + "\r\n").append("屏幕尺寸:" + phone.size + "\r\n").append("屏幕材质:" + phone.screen + "\r\n").append("CUP型号:" + phone.cup + "\r\n").append("电池容量:" + phone.battery + "\r\n");//显示结果((TextView) findViewById(R.id.txtv)).setText(sb.toString());}}

无需多言,类似AlertDialog里面的风格,是不是很爽呢??代码清晰明了。

扫描关注我的微信公众号:




总结:

这种设计模式我们一定要熟练掌握,我们以后提供工具类给别人的时候记得优先考虑的风格就是调用方法后直接返回类本身,这样就可以加快被人写代码的速度,看起来也更加清晰。设计模式都是用来解决一类问题的,而我们掌握的设计模式越多,我们的代码风格也就越清晰优雅,跟着我的脚步我们一起慢慢的学习完26种设计模式吧!期待我以后更新的同时送上今天的demo福利:demo

26设计模式之建造者模式相关推荐

  1. C#设计模式之四建造者模式(Builder Pattern)【创建型】

    一.引言 今天我们要讲讲Builder模式,也就是建造者模式,当然也有叫生成器模式的,英文名称是Builder Pattern.在现实生活中,我们经常会遇到一些构成比较复杂的物品,比如:电脑,它就是一 ...

  2. 建造者模式java_java设计模式3——建造者模式

    java设计模式3--建造者模式 1.建造者模式介绍: 建造者模式属于创建型模式,他提供了一种创建对象得最佳方式 定义: 将一个复杂对象的构建和与它的表示分离,使得同样的构建过程可以创建不同的表示 主 ...

  3. Java设计模式(建造者模式-适配器模式-桥接模式)

    Java设计模式Ⅲ 1.建造者模式 1.1 建造者模式概述 1.2 建造者模式的注意事项和细节 1.3 代码理解 2.适配器模式 2.1 类适配器模式 2.1.1 代码理解 2.2 对象适配器模式 2 ...

  4. 折腾Java设计模式之建造者模式

    博文原址:折腾Java设计模式之建造者模式 建造者模式 Separate the construction of a complex object from its representation, a ...

  5. java设计模式 建造模式_理解java设计模式之建造者模式

    理解java设计模式之建造者模式 发布于 2020-12-10| 复制链接 摘记: 建造者模式(Builder Pattern)主要用于"分步骤构建一个复杂的对象",在这其中&qu ...

  6. 建造者模式 php,PHP设计模式之建造者模式定义与用法简单示例

    本文实例讲述了PHP设计模式之建造者模式.分享给大家供大家参考,具体如下: 建造者模式: 将复杂对象的创建过程和表示进行分离(好吧,我也看不懂什么意思1). 来点我人类能听懂的话: 1.在客户端看来需 ...

  7. 学习《图说设计模式》建造者模式

    图说设计模式之建造者模式 1. 模式动机 无论是在现实世界中还是在软件系统中,都存在一些复杂的对象,它们拥有多个组成部分,如汽车,它包括车轮.方向盘.发送机等各种部件.而对于大多数用户而言,无须知道这 ...

  8. 实践GoF的23种设计模式:建造者模式

    本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:建造者模式>,作者: 元闰子. 简述 在程序设计中,我们会经常遇到一些复杂的对象,其中有很多成员属性,甚至嵌套着多个复杂的对象 ...

  9. java设计模式之建造者模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

最新文章

  1. 如何改变线的长度?CAD .NET热门技术问答精选合集
  2. 再温暖的鸡汤不如一场殊死的战争,诸神之战四赛区冠军出炉!
  3. Name与x:Name的关系--转载
  4. 微信公众号管理系统 RhaPHP1.2.5更新啦!
  5. 一次群晖中勒索病毒后的应急响应
  6. 【最新合集】IDEA 快捷键整理
  7. 网络协议-网络分层、TCP/UDP、TCP三次握手和四次挥手
  8. C/C++编程心得(三)
  9. C语言volatile关键字—最易变的关键字
  10. 菜鸟读jQuery 2.0.3 源码分析系列(1)
  11. python dataframe中缺失值处理
  12. 翻译:PropertyWrapper swift 5 aop特性
  13. 解决smtp出现(500, b'Error: bad syntax')
  14. STC12C5A60S2获取GPS信息(LCD1602显示)(一)
  15. c语言tab什么意思_C语言所有的知识点干货
  16. 将win7 firefox WebStorm PyCharm等JetBrains系列开发软件设置为豆沙绿护眼背景
  17. python在windows中备份文件并压缩的解决办法
  18. 仿速度装机联盟程序源码,装机联盟程序源码 安装联盟程序源码
  19. Quartz+spring列子
  20. NetBeans 常用快捷键

热门文章

  1. 好玩游戏不上学去学计算机,如果你这样学习,不如去玩游戏!
  2. Apple Sign in with Apple(苹果授权登录PHP)
  3. Python实现文本相似度比较分析
  4. GTD时间管理学习心得(1)
  5. 宏观经济学gdp计算方法_宏观经济学答疑总结
  6. amigo幸运字符什么意思_OMG,12 个精致的 Java 字符串操作小技巧,学它
  7. 【解决】ubuntu桌面无法进入问题
  8. 最好用的发短信(验证码、语音短信)接口
  9. 为什么数据库会丢失数据?
  10. Mac重启和关机没反应解决办法