[关闭]
@PheonixHkbxoic 2017-04-11T09:22:26.000000Z 字数 2017 阅读 1093

Builder模式

设计模式


1.构造模式

如何创建对象?
1.构造方法(参数多的话需要很多构造方法)
2.setter方法(很方便,但对象会产生不一致的状态)
3.Builder模式
优点:独特的链式操作,简洁,方便
缺点:增加代码复杂度,产生冗杂,在项目中不可大量使用

  1. package com.jtv.app.common;
  2. /**
  3. * 使用构造者模式创建AST(抽象语法树)对象
  4. * @author PheonixHkbxoic
  5. * @date 2017-4-10 下午06:43:00
  6. *
  7. */
  8. public class AST{
  9. private final String keyword; //关键字 private String等
  10. private final String varchar; //变量
  11. private final String operation; //操作符=+-*{}[]/等
  12. private final String struct; //结构if,switch,while,for等
  13. public String getKeyword() {
  14. return keyword;
  15. }
  16. public String getVarchar() {
  17. return varchar;
  18. }
  19. public String getOperation() {
  20. return operation;
  21. }
  22. public String getStruct() {
  23. return struct;
  24. }
  25. private AST(Builder builder) {
  26. this.keyword = builder.keyword;
  27. this.varchar = builder.varchar;
  28. this.operation = builder.operation;
  29. this.struct = builder.struct;
  30. }
  31. //关键字列表
  32. private static String[] keywords = new String[]{
  33. "private","protect","public",
  34. "final","String","int","float"
  35. };
  36. //关键字是否包含在关键字列表中
  37. private static boolean contain(String keyword,String[] keywords){
  38. boolean doContain = false;
  39. for (int i = 0; i < keywords.length; i++) {
  40. if(keywords[i].equalsIgnoreCase(keyword)){
  41. doContain = true;
  42. break;
  43. }
  44. }
  45. return doContain;
  46. }
  47. //构造者模式中的构造者
  48. public static class Builder{
  49. private final String keyword;//必须
  50. private final String varchar;//必须
  51. private String operation;
  52. private String struct;
  53. public Builder(String keyword,String varchar) {
  54. this.keyword = keyword;
  55. this.varchar = varchar;
  56. }
  57. public Builder setOperation(String operation){
  58. this.operation = operation;
  59. return this;
  60. }
  61. public Builder setStruct(String struct){
  62. this.struct = struct;
  63. return this;
  64. }
  65. public AST build(){
  66. //由于Builder是非线程安全的,所以如果要在Builder内部类中检查一个参数的合法性,必需要在对象创建完成之后再检查。
  67. AST ast = new AST(this);
  68. if(!contain(ast.getKeyword(),keywords)){
  69. new Throwable("非法关键字!");
  70. }
  71. return ast;
  72. }
  73. }
  74. }

2.使用

  1. //调用
  2. AST ast = new AST.Builder("String","str")
  3. .setOperation("=")
  4. .setStruct("[]")
  5. .build();

3.有几个重要的地方需要强调一下:

User类的构造方法是私有的。也就是说调用者不能直接创建User对象。
User类的属性都是不可变的。所有的属性都添加了final修饰符,并且在构造方法中设置了值。并且,对外只提供getters方法。
Builder模式使用了链式调用。可读性更佳。
Builder的内部类构造方法中只接收必传的参数,并且该必传的参数适用了final修饰符。

相比于前面两种方法,Builder模式拥有其所有的优点,而没有上述方法中的缺点。客户端的代码更容易写,并且更重要的是,可读性非常好。唯一可能存在的问题就是会产生多余的Builder对象,消耗内存。然而大多数情况下我们的Builder内部类使用的是静态修饰的(static),所以这个问题也没多大关系。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注