• 2:处理多个构造函数参数(重点是Builder模式)


    静态工厂方法和构造函数有相同的局限性:当构造的对象有多个函数时候,编写都不方便。

    最常用的方法是使用多个构造,不同的构造函数使用不同的参数。这种方式是可行的,但是客户端代码会难以编写,并且难以阅读。

    另一种方法是JavaBean模式,即对每个属性都提供set和get方法,这样来对属性进行控制。但是该模式的局限性在于该模式不能保证一致性。原因是对象的构造过程被分到了几个不同的调用中,这就有可能会产生不一致状态的对象导致程序的失败。需要付出额外的努力来保持线程安全。

    有一种更好的解决方案是Builer模式。看下面的例子:

    package test;
    /*
    * 该类用来演示Builder模式
    */
    public class Date1 {
    private final int year;
    private final int month;
    private final int day;

    /*
    * 静态内部类用于构建外部对象,该类称为构造器
    */
    public static class Builder{
       private int year;
       private int day;
       private int month;
      
       public Builder(int year){
        this.year=year;
       
       }
       /*
       * 方法用来设置属性值,返回值类型为该类的对象
       */
       public Builder month(int month){
        this.month=month;
        return this;
       }
       public Builder day(int day){
        this.day=day;
        return this;
       }
       /*
       * 通过内部类对象构建外部类对象
       */
       public Date1 build(){
        return new Date1(this);
       }
      
    }
    /*
    * 外部类构造函数,参数为静态内部类
    */
    private Date1(Builder builder){
       year=builder.year;
       month=builder.month;
       day=builder.day;
    }
    @Override
    public String toString(){
       return "year:"+year+" month:"+month+" day:"+day;
    }
    public static void main(String[] args) {
       Date1 date=new Date1.Builder(2008).month(8).day(8).build();//这样就能使用一个语句来创建对象,并且能够明确的定义各个属性值
       System.out.println(date);
    }

    }

    这种方法唯一的不足就是创建对象的时候需要首先创建构造器,这会影响程序的性能。

  • 相关阅读:
    php与smarty结合应对表单get的一个小例子
    VC 使用mingw32编译ffmpeg静态库所需文件(二),mingwexsrc.cpp
    wzplayer for delphi
    wzplayer for delphi
    Delphi 调用VC生成的DLL
    VC 使用mingw32编译ffmpeg静态库所需文件(二),mingwexsrc.cpp
    VC使用mingw32编译ffmpeg静态库所需文件(一),ffmpegshim.c
    Delphi和C++数据类型对照表
    VC使用mingw32编译ffmpeg静态库所需文件(一),ffmpegshim.c
    Delphi 调用VC生成的DLL
  • 原文地址:https://www.cnblogs.com/macula7/p/1960802.html
Copyright © 2020-2023  润新知