• 基础设计模式-04 复杂对象创建的建造器模式


    此篇博客,更换格式为MarkDown,请查看:https://www.cnblogs.com/perferect/p/13296581.html

        现在很多人都在用lombok,通过注解就可以简化代码,省略我们好多工作。但是其中有两个注解对于我们创建对象非常好用,一个是@Builder,一个是@Access;

        主要是学习一下@Builder这个注解所涉及到的设计模式;

    1.Java框架中常见的建造器模式

    1.mybatis获取sqlsession

     SqlSession sqlSession = new SqlSessionFactoryBuilder()
            .build(new FileInputStream(new File("/mapper/test.xml")))
            .openSession();
    

    2.封装controller返回信息

    @Data
    public class ResultObj {
    
        private Object result;
        private String message;
        private Integer code;
    
        private ResultObj(Object result,String message,Integer code){
            this.result = result;
            this.message = message;
            this.code = code;
        }
        public static ResultObj successObj(Object obj){
            return successObj(obj,StatusEnum.SUCCESS.getMessage());
        }
        public static ResultObj successObj(Object obj,String message){
            return new ResultObj(obj,message, StatusEnum.SUCCESS.getCode());
        }
        public static ResultObj failObj(){
            return failObj(StatusEnum.FAIL.getMessage());
        }
        public static ResultObj failObj(String message){
            return failObj(null,message);
        }
        public static ResultObj failObj(Object result,String message){
            return new ResultObj(result,message,StatusEnum.FAIL.getCode());
        }
    
    }
    

    2.什么是构造器模式以及建造器模式的好处

    2.1 什么是构造器模式

      将一个复杂对象的构建与它的表示分离,使得同样的建造过程可以建造不同的表示;(一句话总结,就是建对象呗,不过对象里面的参数比较多复杂)

    2.2 建造器模式的UML图

    2.3 建造器模式的优点及不足

        首先,我们一般创建对象的方法有两种:1.构造器创建;2.通过属性set方法创建;

    构造器创建对象:

    class  A{
     private String a;
     private String b;
     private  String c ;
    
     A(){} 
     A(String a){
         this.a = a;
     }  
      A(String a,String b){
         this.a = a;
        this.b = b;
     }
     A(String a,String b,String c){
         this.a = a;
        this.b = b;
        this.c = c ;
     }
    
    }
    

    set方式创建对象

    class  B{
     private String a;
    
     B(){} 
     
      public void setA(){
        this.a = a
      }   
      public String getA(){
        return this.a ; 
      } 
    }
    

    分析一下上面两种方式存在的问题:

    - 1. 构造器创建对象,多个属性的话,必须严格按照顺序注入;set方法不存在这种问题;
    
    -  2.构造器创建对象,可读性差,如果对象中有多个属性赋值 ,必须清楚每个属性参数位置;set方法不存在这种问题;
    
    - 3.set方法创建对象,对象在使用过程中,容易被错修改; 
    

    根据上面可知,当复杂对象创建时,构造器方法可读性很差,且属性传参不方便,set方法创建对象在使用过程中可能出现误操作的缺点;

    建造器模式完美的解决了上面的两种问题;

    3.建造器模式的使用

    通过创建builder接口,或者内置静态成员类,来创建构造器;

    public class NutritionFacts {
    
        private final int serversize;
        private final int servers;
        private final int calorizes;
        private final int fat;
        private final int sodium;
        private final int carbohydrate;
    
        static class Builder{
            //必填项
            private final int serversize;
            private final int servers;
            //选填项
            private  int calorizes;
            private  int fat;
            private  int sodium;
            private  int carbohydrate;
    
            public Builder(int serversize,int servers){
                this.serversize = serversize;
                this.servers = serversize;
            }
            public  Builder calorizes(int calorizes){
                this.calorizes = calorizes;
                return this;
            }
            public Builder fat(int fat){
                this.fat = fat;
                return this;
            }
            public Builder sodium(int sodium){
                this.sodium = sodium;
                return this;
            }
            public Builder carbohydrate(int carbohydrate){
                this.carbohydrate = carbohydrate;
                return this;
            }
            //增加一个创建对象的build
            public NutritionFacts build(){
                return new NutritionFacts(this);
            }
        }
    
        public NutritionFacts(Builder builder){
            this.serversize = builder.serversize;
            this.servers = builder.servers;
            this.calorizes = builder.calorizes;
            this.fat = builder.fat;
            this.sodium = builder.sodium;
            this.carbohydrate = builder.carbohydrate;
        }
    
    
    }
    

    4.除了建造器模式,普通对象创建的简易方法

      上面说了lombok还提供了 @Access注解,这个注解的原理比较简单,就是将传统的set方法变成静态,返回当前对象; 
    
    class A{
      private String name;
      
      public static A setName(String name){
          this.name = name;
          return this;
      }      
    }
    

    以上就是对构造器模式的简单介绍。

  • 相关阅读:
    Qt 布局之二:水平、垂直布局的使用详解
    Qt 布局之一:布局初探
    [数据库] SQL 语法之进阶篇
    [数据库] SQL 语法之基础篇
    看图深入理解单链表的反转
    [数据结构
    (原)tslib的交叉编译
    (转) s-video vs. composite video vs. component video 几种视频格式详细说明和比较
    (转)BT1120接口及协议
    (转)Ubuntu12.04上NFS Server安装使用过程
  • 原文地址:https://www.cnblogs.com/perferect/p/13296581.html
Copyright © 2020-2023  润新知