第一章 创建和销毁对象

创建和销毁对象

考虑用静态工厂的方法代替构造器
类可以提供一个公有的静态工厂方法,它只是返回类的实例构造方法。这里所指的静态工厂方法不同于设计模式的静态工厂方法。

public static Boolean valueIOf(Boolean b) {
		return b?Boolean.TRUE:Boolean.FALSE;
	}

优势一:静态方法都有名称:通过名称判定更方便了解且更易阅读返回的内容是什么。
优势二:不必每次调用它们的时候都创建一个新的对象
优势三:在创建参数类型实例时,它们使代码变得更加简洁。

public class HashMapUtils {
	public static<K,V> HashMap<K,V> newInstance(){
		return new HashMap<K,V>();
	}
}
Map<String,Object> map=HashMapUtils.newInstance();

缺点一:类如果不含有公有或者受保护的构造器,就不能被子类实例化。
缺点二:它于其它的静态方法实际上没有任何区别。

遇到多个构造器参数时,要考虑构建器
第一种情况,正常情况下有很多参数的时候我们会通过构造方法重载来进行区分,即为不同的参数列表创建不同功能的构造器,这样的结果就是阅读困难,其它开发人员也很难理解其中的意思。

第二种情况,我们要是用JavaBean来创建。这样就可以随意选择填写参数。但是这样JavaBean模式阻止了把类做成不可变的可能,这就需要程序员额外作出努力来确保它的线程安全。

第三种情况:这是推荐的一种方式,既能保证像重叠构造器模式那样的安全性,也能保证像JavaBean模式那么好的可读性。这就是Builder模式的一种形式,不直接生成你想要的对象,而是让客户端在builder调用类似setter的方法,来设置每个相关的可选参数。最后客户端调用无参的build方法来生成不可变的对象,这个builder是它构建的类的静态成员类。

package com.cui;

public class Car {
	private final String name;//车名
	private final int size;//大小
	private final int number;//车牌号
	private final String brand;//品牌
	private final String factoryAddress;//生产厂家
	
	public static class Builder{
		//需要传入的参数
		private final int number;//车牌号
		private final String factoryAddress;
		//初始化参数
		private String name="car";//车名
		private int size=2;//大小
		private String brand="brand";//品牌
		
		public Builder(int number,String factoryAddress) {
			this.number=number;
			this.factoryAddress=factoryAddress;
		}
		public Builder name(String val) {
			name=val;
			return this;
		}
		public Builder size(int val) {
			size=val;
			return this;
		}
		public Builder brand(String val) {
			brand=val;
			return this;
		}
		public Car builder() {
			return new Car(this);
		}
		
	}
	public Car(Builder builder) {
		name=builder.name;
		size=builder.size;
		number=builder.number;
		brand=builder.brand;
		factoryAddress=builder.factoryAddress;
	}
	public String getName() {
		return name;
	}
	public int getSize() {
		return size;
	}
	public int getNumber() {
		return number;
	}
	public String getBrand() {
		return brand;
	}
	public String getFactoryAddress() {
		return factoryAddress;
	}
}

这就是构建器的代码,接下来进行调用。

方式一
public static void main(String[] args) {
		Builder builder=new Car.Builder(11,"Japan");
		Car car=builder.brand("toyto").builder();
		System.out.println(car.getBrand()+"---"+car.getFactoryAddress()+"---"+car.getNumber());
	}

结果如下:
toyto---Japan---11


方式二:
public static void main(String[] args) {
		Car car=new Car.Builder(12, "German").builder();
		System.out.println(car.getBrand()+"---"+car.getFactoryAddress()+"---"+car.getNumber());
	}

结果如下:
brand---German---12

Builder像一个构造器一样,可以对其参数加强约束条件,builder方法可以检查这些约束条件,将参数builder拷贝到对象之后,并在对象域而不是builder域中对他们进行检验,这一点很重要。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值