티스토리 뷰
1. Singleton
public class SerialNumberGenerator { private int count = 0; private SerialNumberGenerator() { } private static class SerialHolder { private static final SerialNumberGenerator serial = new SerialNumberGenerator(); } public static SerialNumberGenerator getInstance() { return SerialHolder.serial; } public int getNext() { return ++count; } }
public class SerialNumberGenerator { private int count = 0; private SerialNumberGenerator() { } private static class SerialHolder { private static final SerialNumberGenerator serial = new SerialNumberGenerator(); } public static SerialNumberGenerator getInstance() { return SerialHolder.serial; } public int getNext() { return ++count; } }
public class BankAccount { private int accountNumber; public BankAccount() { accountNumber = SerialNumberGenerator.getInstance().getNext(); } public String toString() { return String.format("A8: %d", accountNumber); } }
클래스의 인스턴스를 자유롭게 생성할 수 있다면 각 객체에 고유한 일련번호를 부여하는 것이 어렵다. 따라서 이 클래스는 singleton으로 모델링 되어야한다.
BankAccount의 객체를 생성시 마다 일련번호(count)를 받을때, BankAccount클래스의 static 멤버변수로 count를 생성하는 것과 무엇이 다를까? => 다른 기능적 차이는 없다. 하지만 모든 클래스와 메소드는 하나의 기능을 가지는 것이 좋다.
2. DoubleTon
객체를 생성을 하나만 하는 것이 Singleton이다. Doubleton도 가능할까?
public class Doubleton { private String name; private static boolean isFirst = false; private Doubleton(String n) { name = n; } public String getName() { return name; } private static class Holder1 { private static final Doubleton instance = new Doubleton("First"); } private static class Holder2 { private static final Doubleton instance = new Doubleton("Second"); } public static Doubleton getInstance() { isFirst = !isFirst; if (isFirst) { return Holder1.instance; } else { return Holder2.instance; } } }
public class DoubletonTest { public static void main(String[] args) { Doubleton first = Doubleton.getInstance(); Doubleton second = Doubleton.getInstance(); Doubleton third = Doubleton.getInstance(); System.out.println(first.getName()); System.out.println(second.getName()); System.out.println(third.getName()); } }
난 boolean변수를 두고 true일 경우와 false일 경우로 나누어서 생성하였다. 2개가 아닌 그 이상일 경우에는 어떻게 할까?
3. Multiton
import java.util.HashMap; public class Multiton { private static final HashMapregistry = new HashMap (); private static final int NUMBEROFINSTANCE = 3; public static Multiton Multi; private Multiton() { } public static Multiton getInstance(String type) { if (registry.containsKey(type)) { return registry.get(type); } else if (registry.size() < NUMBEROFINSTANCE){ Multi = new Multiton(); registry.put(type, Multi); return Multi; } return null; } }
Multiton은 이런 식으로 구현하면 될 것같다. (멀티스레드 문제는 신경쓰지 않음)
'Paradigm > OOP' 카테고리의 다른 글
[OOP] AdapterPattern (0) | 2013.05.10 |
---|---|
[OOP] 초기화를 위한 Null Object (0) | 2013.04.27 |
[OOP] CommandPattern 구현해보기 (0) | 2013.04.27 |
[OOP] Singleton Pattern의 생성자문제 (0) | 2013.04.19 |
[OOP] Observable의 단점 (0) | 2013.04.19 |
댓글
최근에 올라온 글
최근에 달린 댓글
글 보관함
- Total
- Today
- Yesterday