프로그래밍/Js

[es6] builder pattern (빌더패턴) 샘플

소행성왕자 2023. 8. 2. 17:01
// 빌더패턴 
const User = class {
	constructor(build) {
		if(build) {
			this.id = build.id;
			this.name = build.name;
			this.age = build.age;
		}
	}

	static get Builder() {
		class Builder {
			setId(id) {
				this.id = id;
				return this;
			}
			setName(name) {
				this.name = name;
				return this;
			}
			setAge(age) {
				this.age = age;
				return this;
			}
			build() {
				return new User(this);
			}

		}

		return new Builder();
	}
}

const builder = User.Builder;
const user1 = builder
				.setId(1)
				.setName('Alice')
				.setAge(22)
				.build();
dd(user1, 'user1');
const user2 = builder
				.setId(2)
				.setName('boy')
				.setAge(33)
				.build();
dd(user2, 'user2');

 

상속을 이용한 빌더패턴


// 상속을 이용한 빌더패턴
const Builder = class {

	init() {
		Object.keys(this).forEach((key) => {
			const setterName = `set${key.substr(0, 1).toUpperCase()}${key.substr(1)}`;

			this[setterName] = value => {
				this[key] = value;
				return this;
			};
		});
	}

	build() {
		return this;
	}

};
const User = class extends Builder {
	constructor() {
		super();

		this.id = -1;
		this.name = null;
		this.age = 0;

		super.init();
	}
}
const user3 = new User()
	.setId(1)
	.setName('json')
	.setAge(22)
	.build();
dd(user3, 'user3');
dd(user3.name, 'user3.name')

const user4 = new User()
	.setId(2)
	.setName('park')
	.setAge(33)
	.build();
dd(user4, 'user4');
dd(user4.name, 'user4.name')