티스토리 뷰

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 HashMap registry = 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