- High-level modules should not depend on low-level modules. Both should depend on abstractions (e.g., interfaces).
- Abstractions should not depend on details. Details (concrete implementations) should depend on abstractions.
public class MyBook {
public MyBook() {
}
public static MyBook getChildInstance() {
return MyBookChild.getInstance();
}
}
public class MyBookChild extends MyBook {
private MyBookChild() {
}
public static MyBookChild getInstance() {
return new MyBookChild();
}
}
public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType) {
Enum<?>[] universe = getUniverse(elementType);
if (universe == null)
throw new ClassCastException(elementType + " not an enum");
// 원소의 수에 따라 다른 하위 클래스의 인스턴스 반환
if (universe.length <= 64)
return new RegularEnumSet<>(elementType, universe);
else
return new JumboEnumSet<>(elementType, universe);
}
public abstract class Animal {
// 추상 팩터리 메서드
abstract AnimalToy getToy();
}
public abstract class AnimalToy {
abstract void identify();
}
public class Cat extends Animal {
// 추상 팩터리 메서드 오버라이딩
@Override
AnimalToy getToy() {
return new CatToy();
}
}
//팩터리 메서드가 생성할 객체
public class CatToy extends AnimalToy {
@Override
public void identify() {
System.out.println("cat toy");
}
}
public class Dog extends Animal {
// 추상 팩터리 메서드 오버라이딩
@Override
AnimalToy getToy() {
return new DogToy();
}
}
//팩터리 메서드가 생성할 객체
public class DogToy extends AnimalToy {
public void identify() {
System.out.println("dog toy");
}
}
public class Driver {
public static void main(String[] args) {
// 팩터리 메서드를 보유한 객체들 생성
Animal dog = new Dog();
Animal cat = new Cat();
// 팩터리 메서드가 반환하는 객체들
AnimalToy dogToy = dog.getToy();
AnimalToy catToy = cat.getToy();
// 팩터리 메서드가 반환한 객체들을 사용
dogToy.identify();
catToy.identify();
}
}
Source