Design pattern - Singleton pattern, Factory pattern, Strategy pattern

Singleton pattern
해당 클래스의 인스턴스(해당 클래스가 메모리에 실제로 할당되는 것)가 하나만 만들어지고, 하나의 인스턴스만 관리하는 것이 바로 singleton pattern이에요.


pseudo code.
public class Singleton
{
 private static Singleton Instance;

 private Singleton(){}

 public static Singleton getInstance()
 {
  if (Instance == null)
  {
   Instance = new Singleton();
  }
  return Instance;
 }
}
위의 코드에서는 instance의 여부를 체크하여, 없을 경우에만 Singleton instance를 생성하는 구조를 가지고 있지요.


Factory pattern

(출처 - 위키피디아)

팩토리 메소드 패턴이란
객체를 생성하기 위한 인터페이스를 정의하나, 실질적으로 어떤 클래스를 생성할지는 하위 클래스에서 결정하는 것을 의미해요.

즉 구체 클래스 정의와 인스턴스 생성이 서로 분리되어 있는 것으로, 자식 클래스가 필요에 따라 필요한 인스턴스를 생성 가능한 것이라고 보면 되겠어요.
이는 상위코드에 구체 클래스를 감추기 위한 용도로도 많이 활용됩니다.

pseudo code(wikipedia의 C#코드를 참조해 java문법으로 바꾸었어요.)

public abstract class Pizza
{
 public abstract java.math.BigDecimal GetPrice();

 public enum PizzaType
 {
  HamMushroom,
  Deluxe,
  Seafood
 }
 public static Pizza PizzaFactory(PizzaType pizzaType)
 {
  switch (pizzaType)
  {
   case HamMushroom:
    return new HamAndMushroomPizza();

   case Deluxe:
    return new DeluxePizza();

   case Seafood:
    return new SeafoodPizza();

  }

  throw new UnsupportedOperationException("The pizza type " + pizzaType.toString() + " is not recognized.");
 }
}
public class HamAndMushroomPizza extends Pizza
{
 private java.math.BigDecimal price = new java.math.BigDecimal(8.5);
 @Override
 public java.math.BigDecimal GetPrice()
 {
  return price;
 }
}

public class DeluxePizza extends Pizza
{
 private java.math.BigDecimal price = new java.math.BigDecimal(10.5);
 @Override
 public java.math.BigDecimal GetPrice()
 {
  return price;
 }
}

public class SeafoodPizza extends Pizza
{
 private java.math.BigDecimal price = new java.math.BigDecimal(11.5);
 @Override
 public java.math.BigDecimal GetPrice()
 {
  return price;
 }
}

// Somewhere in the code
//...
  System.out.println(Pizza.PizzaFactory(Pizza.PizzaType.Seafood).GetPrice().toString("C2")); // $11.50
//...

즉 위의 코드를 보면 상위 abstract 클래스인 pizza 가 있고, 이를 상속받은 하위클래스 HamMushroom, Deluxe, Seafood가 pizza instance를 생성하는 것을 볼 수가 있어요.



Strategy pattern
스트래티지 패턴이란, 알고리즘군을 정의하고 각각을 캡슐화해서 교환하여 사용할 수 있도록 한 것을 의미해요. 스트래티지 패턴을 사용하면, 알고리즘을 사용하는 클래스가 독립적으로 알고리즘을 변경할 수 있지요.

일반적으로는, 상위 클래스에 메소드를 생성하는 게 아니라 별도의 인터페이스를 형성하고 이를 implement해주는 방식으로 알고리즘을 하위 class에 추가해 구현하는 방식을 사용하지요.

pseudo code는 http://hyeonstorage.tistory.com/146 에 잘 나와 있네요.

댓글 없음:

댓글 쓰기

글에 대한 의문점이나 요청점, 남기고 싶은 댓글이 있으시면 남겨 주세요. 단 악성 및 스팸성 댓글일 경우 삭제 및 차단될 수 있습니다.

모든 댓글은 검토 후 게시됩니다.

Translate