zoukankan      html  css  js  c++  java
  • 基础设计模式-04 复杂对象创建的建造器模式

       现在很多人都在用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;
      }      
    }

         

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

     

     

     

     

     

  • 相关阅读:
    MySQL索引长度限制问题
    Mysql查询缓存碎片、缓存命中率及Nagios监控
    PHP多台服务器跨域SESSION共享
    php会话全揭秘
    深入PHP中慎用双等于(==)的详解
    php二进制安全的含义
    分表,分库算法
    php学习网站推荐
    在linux平台下,设置core dump文件属性(位置,大小,文件名等)
    常用Linux shell命令汇总
  • 原文地址:https://www.cnblogs.com/perferect/p/12916663.html
Copyright © 2011-2022 走看看