`

重叠构造器、Builder模式

 
阅读更多

   当存在做个参数时,但是有些是必选的,有些事不必选的情况下用重叠构造器、Builer模式比较好

     重叠构造器

   

public student(String name, int age){
  this(name,age,""); 
}
public student(String name, int age,String address){
  this(name,age,address,0); 
}
public student(String name, int age,String address,int telphone){
  this(name,age,address,telephone,""); 
}
public student(String name, int age,String address,int telphone,String nickname){
  this(name,age,address,telephone,nickname); 
}

 这样的话当你创建 new Student("张三",22);这样其它值就为0或“”了。

   

Builder模式

public class BuilderModel {
   private final String name;
   private final int age;
   private final String number;
   private  final String address;
   //private final String nickname;
   private final int tel;
   
   public static class Builder{
	   //必填参数
	   private final String name;
	   private final int age;
	   //可算参数
	   private String number;
	   private String address;
	   private int tel;
	   //name 和age 为必填参数
	   public Builder(String name ,int age){
		   this.name = name;
		   this.age = age;
	   }
	   //可选参数方法池
	   public Builder setNumber(String val){
		    this.number =val; 
		    return  this;
	   }
	   public Builder setAddress(String val){
			this.address = val ;
			return this;		
	   }
	   public Builder setTel(int val){
		    this.tel = val;
		    return this;
	   }
	   public BuilderModel buid(){
		   return new BuilderModel(this);
	   }
	   
   }
   
	private BuilderModel(Builder builder){
		this.name = builder.name;
		this.age = builder.age;
		//this.nickname = b
		this.address = builder.address;
		this.number = builder.number;
		this.tel = builder.tel;
	   
	}

	
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
        BuilderModel model = new BuilderModel.Builder("zs",22).setAddress("北京朝阳区").setNumber("12345").setTel(110).buid();
	    System.out.println(model.name+model.age);
	    //model.age = 2;  final type should not be asigned again!
	}
}

 

这样 对于每个参数都比较清晰明了,更加易读,有人可能会问为什么不用对象封装属性,因为用对象封装属性当作参数的时候,不能确定它的不变动性(即比如你打算第一个方法调用 Student 对象,下面又有一个方法调Student对象,但是当你在第一个方法里面如果对Student 对象做了修改的话,那样后面一个也就跟着修改了,因为是同一个引用)

例如

public class BuilderModel {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		BuilderModel.Student stu = new BuilderModel.Student("张三",22);
		method1(stu);
		method2(stu);		
	}
	public static class Student{		
		public  String name;
		public int age;
        public Student(String name,int age){
		   this.name = name;
		   this.age = age;
 		}
	}
	public static void method1(Student stu){
	   stu.name = "李四";	
	}
	public static void method2(Student stu){
	   System.out.println(stu.name);
	}
	
}

 

对于方法中的参数是对象时,前面加final是不影响修改这个对象里面的方法的。

 

 如有任何缺陷请大家不吝赐教,必当洗耳恭听!

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论
1 楼 xurichusheng 2012-01-12  
    不直接诶生成想要的对象,而是让客户端利用所有必要的参数调用构造器(或者静态工厂),得到一个builder对象。
    然后客户端在builder对象上调用类似于setter的方法,来设置每个相关的可选参数。
    最后,客户端调用无参的build方法来生成不可变的对象。

相关推荐

    Java设计中的Builder模式的介绍

    今天,我们将通过一个 Person 例子来分析重叠构造器模式、Builder 模式的使用场景,以及运用 JavaBeans 模式弥补重叠构造器模式的不足。 首先,让我们了解什么是 Builder 模式。Builder 模式是一种 creational 设计...

    Effective-Java读书笔记(上)

    - **重叠构造器模式**:这种模式下,每个构造器提供比前一个多一个参数,但是这种模式会导致构造器过多,增加复杂度。 - **JavaBeans模式**:虽然使用无参构造器并结合setter方法看起来简单,但可能导致对象状态的不...

    Effective Java.docx

    **重叠构造器模式**:这种方法提供了多个构造器,每个构造器接受不同数量的参数。虽然解决了某些问题,但在参数较多时会导致构造器数量激增,使代码难以维护。 **JavaBeans模式**:通过无参构造器创建对象,然后...

    二十三种设计模式【PDF版】

    汽车由车轮 方向盘 发动机很多部件组成,同时,将这些部件组装成汽车也是一件复杂的工作,Builder 模式就是将这两 种情况分开进行。 设计模式之 Prototype(原型) 用原型实例指定创建对象的种类,并且通过拷贝这些...

    java7hashmap源码-for-java:java学习笔记

    使用重叠构造器; 使用Build模式【构建器】: new A.Build().set.set.build(); Build模式也适用于类层次结构 递归类型参数 /* * 递归类型参数: java 没有self,为了子类能返回正确的类型【即类型为Build的子类】 * *...

    C#英文词典

    5. 建造者模式(Builder):将复杂对象的构建与表示分离,使同样的构建过程可以创建不同的表示。 四、数据结构 1. 链表(LinkedList):动态数据结构,通过节点链接进行数据存储。 2. 栈(Stack):后进先出(LIFO...

    android知识点整理

    - JVM通过垃圾回收器自动管理内存,回收不再使用的对象所占用的内存空间。 - 主要有四种常用的垃圾收集算法:标记-清除算法、复制算法、标记-整理算法和分代收集算法。 - GC分为年轻代和老年代,年轻代中的对象...

Global site tag (gtag.js) - Google Analytics