Study

[디자인패턴 - javascript] 파트1

wookjae 2024. 10. 23. 23:03

☆ 빌더 패턴 - 복잡한객체를 완성도 있게 만드는 패턴   ★

. 객체생성 자체가복잡한 경우

. 필수 / 선택속성이 나뉘어져있는경우

. 객체가 완성된건지 궁금한경우

class Person {
  // constructor(name, age, address) {
  //     if (!name) {
  //       throw new Error("name required!!");
  //     }
  //     this.name = name;
  //     this.age = age;
  //     this.address = address;
  //   }

  constructor(builder) {
    this.name = builder.name;
    this.age = builder.age;
    this.address = builder.address;
  }

  // setAge(age) {
  //   this.age = age;
  // }

  // setAddress(address) {
  //   this.address = address;
  // }

  static Builder(name) {
    return new PersonBuilder(name);
  }
}

/// 생성패턴(1) - 기존방식
// const pp = new Person("jp");
// pp.setAge(32);
// pp.setAddress("123333");
// console.log(pp);

// PersonBuilder 생성자에서는 필수 인 속성만 받는다./
class PersonBuilder {
  constructor(name) {
    if (!name) {
      throw new Error("Name is Null");
    }
    this.name = name;
  }

  // 선택적인 부분은 Setter함수를 통해 등록할 수 있도록 따로 두는 것 ..
  setAge(age) {
    this.age = age;
    return this;
  }

  setAddress(address) {
    this.address = address;
    return this;
  }

  build() {
    return new Person(this);
  }
}

// 생성패턴(2) - 빌더패턴 방식
const a = Person.Builder("ukjae").setAge(36).build();
console.log(a);

 

 

 


☆ 팩토리(공장) 패턴   ★

. 자바스크립트 class문법때문에 요즘에는 잘 쓰이지 않는다. 

. 펑션에 특정한 속성을 받아서 특정한 Object와 같은 대상을 만드는 그런 패턴이다.         >>  호출할 떄 새로운 Obj생성.

. 일전에 클래스에 private속성이 없었을때는 팩토리 패턴이 자주 사용됨.. (현재는 클래스에  정적static 까지지원된다. )

. 상속이 아니라 함수간의 합성이 하고싶을때는 사용되는 한다. 

function factory(name, age, married) {
  // 'married' : isMarried라는 함수안에서만 쓰이는 private 변수가 된다.
  const isMarried = () => married;
  return { name, age, isMarried };
}

const a = factory("zeroCho", 36, "N");

//// 팩토리패턴 대신에 사용되는 클래스..(최근자바스크립트)
class Person {
  // static속성
  static isAlive;

  // private속성
  #married;
  constructor(name, age, married) {
    this.name = name;
    this.age = age;
    this.#married = married;
  }

  isMarried() {
    return this.#married;
  }
}


     

 


☆ Single(싱글턴) 패턴  - 딱 한번만 객체를 생성하고 싶을 경우   ★

. 싱글턴 패턴은 앱 전체에서 딱 하나만만들어질 객체들
. 그것들을 싱글턴으로 생성..
. 매번 NEW를 해도 항상 같은객체가 나오게 하고싶다?
. 즉 클래스 인스턴스가 딱 하나이고 싶다.

class Person {
  static instance;
  #married;
  // private속성

  constructor(name, age, married) {
    // Person.instance가 존재한다면 리턴
    if (Person.instance) {
      return Person.instance;
    }

    this.name = name;
    this.age = age;
    this.#married = married;
    Person.instance = this;
  }

  isMarried() {
    return this.#married;
  }
}

alert(new Person() == new Person()); //TRUE

 

 

 


☆ 어댑터(Adapter) 패턴  - 형태가 안맞을 시 적절한 패턴.   ★

 

. USB(변환잰더) = 형태 변환   어댑터패턴과 유사 

. 형태가 안맞는경우에, 그 안맞는 중간을 맞춰주는 패턴을 어댑터 패턴.    

// app이라는 함수 >>  객체(obj)를 받아서 run이라는 함수를 실행.
function app(obj) {
  obj.run();
}

class Service {
  // run이라는 함수가존재하지 않음.. execute 함수만존재..
  execute() {
    alert("exectue실행!!!!!");
  }
}

class ServiceAdapter {
  constructor(obj) {
    this.obj = obj;
  }

  run() {
    this.obj.execute();
  }
}

// Service클래스에 run함수가 없어서 애러가 발생..  X
// 따라서 Service를 감싸는 ServiceAdapter를 한번더 사용.
//app(new Service());

app(new ServiceAdapter(new Service()));