创造者模式

本篇博客来简要的讲解下创造者模式

  • 创造者模式原理
  • 创造者模式适用场景
  • 代码示例

原理介绍:
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。在用户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象。用户只需要给出指定复杂对象的类型和内容 建造者模式负责按顺序创建复杂对象(把内部的建造过程和细节隐藏起来)。
适用场景:
需要生成的产品对象有复杂的内部结构,这些产品对象具备共性;
隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。
代码示例:

package moshi.gunanyi.com.建造者模式;
/**
 * 建造者模式
 * @author Administrator
 *
 */

public class User {
	//下面是“一堆”的属性
	private String name;
	private String nickName;
	private String password;
	private int age;
	
	//构造方法私有化,不然客户端就会直接调用构造方法了
	private User(String name,String password,String nickName,int age) {
		this.name = name;
		this.password = password;
		this.nickName = nickName;
		this.age =age;
	}
	//静态方法,用于生成一个Builder,这个不一定要有,不过写这个是一个很好的喜欢
	public static UserBuilder builder() {
		return new UserBuilder();
	}
	public static class UserBuilder{
		//下面是和User一模一样的一堆属性
		private String name;
		private String password;
		private String nickName;
		private int age;
		public UserBuilder() {
		}
		//链式调用设置各个属性值,返回this,即UserBuilder
		public UserBuilder name(String name) {
			this.name = name;
			return this;
		}
		public UserBuilder password(String password) {
			this.password = password;
			return this;
		}
		public UserBuilder nickName(String nickName) {
			this.nickName = nickName;
			return this;
		}
		public UserBuilder age(int age) {
			this.age = age;
			return this;
		}
		//builder()方法负责将UserBuilder中设置好的属性“复制”到User中.
		//当然,可以“复制”之前做点检验
		public User build() {
			if(name==null||password==null) {
				throw new RuntimeException("用户名或密码错误");
			}
			if(age<=10||age>=150) {
				throw new RuntimeException();
			}
			//还可以做赋予“默认值的功能
			if(nickName==null) {
				nickName = name;
			}
			return new User(name,password,nickName,age);
		}
	}
}

测试代码:

package moshi.gunanyi.com.建造者模式;
/**
 * 测试
 * @author Administrator
 *
 */
public class Test {

	public static void main(String[] args) {
		User d = User.builder().name("foo").password("123456")
				.age(25).build();
		
	}

}

核心是:先把所有的属性都设置给 Builder,然后 build() 方法的时候,将这些属性复制给实际产生的对象。

猜你喜欢

转载自blog.csdn.net/qq_37520037/article/details/82927484