디자인 모델 -- 공장 방법 모델 [공장 방법 패턴]
여 와 가 사람 을 만들다.
여 와 는 보충 한 후에 인간 세상 에 내 려 가 보 았 다. 와 싸, 풍경 이 너무 아름 다 웠 다. 하늘 은 짙 푸 르 고 물 은 맑 았 다. 공 기 는 맑 고 너무 아름 다 웠 다. 그리고 시간 이 지나 면 좀 외 로 웠 다. 동물 이 없 었 다. 이런 것들 은 모두 정태 적 인 것 이 었 다. 어 떡 하지?
신선 이라는 것 을 잊 지 마 세 요. 할 수 없 는 일이 없어 요. 그래서 여 와 는 팔괘 로 (기술 용어: 공장 설립) 를 세 워 사람 을 만 들 기 시 작 했 습 니 다. 구체 적 인 과정 은 이 렇 습 니 다. 먼저 진흙 을 빚 은 다음 에 팔괘 로 에 구 운 다음 에 바닥 에 던 져 서 자 랐 습 니 다. 그러나 의외로 항상 생산 되 었 습 니 다.
처음 구 운 토우, 지 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈
두 번 째 토우 구 이, 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈
세 번 째 토우 구 이, 즈 ~ 즈 ~ 즈 ~, 구 우 면서 지 켜 봐, 헤 이, 딱 좋아, 퍼 펙 트!우수, 노란색 인간!
이 과정 은 비교적 재 미 있 습 니 다. 먼저 유형 도 를 보 세 요.
프로그램 으로 구현 하고 인간 의 총칭 을 먼저 정의 합 니 다.
public interface IHuman {
public void laugh();
public void cry();
public void talk();
}
그리고 구체 적 인 인간 을 정의 한다.
public class YellowHuman implements IHuman {
public void laugh(){
System.out.println(" , !");
}
public void cry(){
System.out.println(" ");
}
public void talk(){
System.out.println(" , ");
}
}
public class WhiteMan implements IHuman {
public void laugh(){
System.out.println(" , ");
}
public void cry(){
System.out.println(" ");
}
public void talk(){
System.out.println(" , !");
}
}
public class BlackMan implements IHuman {
public void laugh(){
System.out.println(" ");
}
public void cry(){
System.out.println(" ");
}
public void talk(){
System.out.println(" , ");
}
}
인류 도 정 의 를 마 쳤 다. 그러면 우 리 는 팔괘 로 (공장) 를 정의 한다.
public class HumanFactory {
public static Human createHuman(Class c) {
Human human=null; //
try{
human = (Human)Class.forName(c.getName()).newInstance(); //
}catch (InstantiationException e){// , , ,
System.out.println(" ");
}catch (IllegalAccessException e){ // , , ...
System.out.println(" !");
}catch (ClassNotFoundException e){ // , ?!
System.out.println(" , !");
}
return human;
}
}
그런 후에 우 리 는 다시 여 와 를 성명 했다.
public class NvWa {
public static void main(String[] args) {
// , , , ,
System.out.println("------------ : -----------------");
Human whiteHuman = HumanFactory.createHuman(WhiteHuman.class);
whiteHuman.cry();
whiteHuman.laugh();
whiteHuman.talk();
// , , ,
System.out.println("
------------ : -----------------");
Human blackHuman = HumanFactory.createHuman(BlackHuman.class);
blackHuman.cry();
blackHuman.laugh();
blackHuman.talk();
// , ,
System.out.println("
------------ : -----------------");
Human yellowHuman = HumanFactory.createHuman(YellowHuman.class);
yellowHuman.cry();
yellowHuman.laugh();
yellowHuman.talk() ;
}
}
이렇게 하면 세상 이 떠들썩 해 지고 사람 도 생 긴 다. 그러나 이렇게 만 드 는 것 은 너무 피곤 하고 신선 도 피곤 할 것 이다. 그러면 어떻게 하지?
여 와 는 사람 을 만 들 었 다 (두 번 째 시도)
신선 은 생각 했다. 나 는 진흙 을 쑤 셔 넣 고 무 작위 로 한 무리의 사람들 이 나 왔 다. 그 가 흑인, 백인, 황 인 이 든 사람 이 라면 된다.
그리고 우리 의 프로그램 수정 을 보고 Human Factory. java 를 수정 하여 createHuman () 방법 을 추 가 했 습 니 다.
public class HumanFactory {
public static Human createHuman(Class c) {
Human human=null; //
try{
human = (Human)Class.forName(c.getName()).newInstance(); //
}catch (InstantiationException e){// , , ,
System.out.println(" ");
}catch (IllegalAccessException e){ // , , ...
System.out.println(" !");
}catch (ClassNotFoundException e){ // , ?!
System.out.println(" , !");
}
return human;
}
// , ,
public static Human createHuman(){
Human human=null; //
// ,
List<Class> concreteHumanList = ClassUtils.getAllClassByInterface(Human.class); //
//
Random random = new Random();
int rand = random.nextInt(concreteHumanList.size());
human = createHuman(concreteHumanList.get(rand));
return human;
}
}
그리고 여 와 가 어떻게 만 들 었 는 지 보 자.
public class NvWa {
public static void main(String[] args) {
// , , , ,
System.out.println("------------ : -----------------");
Human whiteHuman = HumanFactory.createHuman(WhiteHuman.class);
whiteHuman.cry();
whiteHuman.laugh();
whiteHuman.talk();
// , , ,
System.out.println("
------------ : -----------------");
Human blackHuman = HumanFactory.createHuman(BlackHuman.class);
blackHuman.cry();
blackHuman.laugh();
blackHuman.talk();
// , ,
System.out.println("
------------ : -----------------");
Human yellowHuman = HumanFactory.createHuman(YellowHuman.class);
yellowHuman.cry();
yellowHuman.laugh();
yellowHuman.talk() ;
// , ,
for(int i=0;i<10000000000;i++){
System.out.println("
------------ -----------------" + i);
Human human = HumanFactory.createHuman();
human.cry();
human.laugh();
human.talk();
}
}
}
와, 세상 이 떠들썩 하 다!하지만 아직 끝나 지 않 았 습 니 다. 이 프로그램 은 뛰 지 못 하고 이런 종류 가 있어 야 합 니 다.
@SuppressWarnings("all")
public class ClassUtils {
// ,
public static List<Class> getAllClassByInterface(Class c){
List<Class> returnClassList = new ArrayList<Class>(); //
// ,
if(c.isInterface()){
String packageName = c.getPackage().getName(); //
try {
List<Class> allClass = getClasses(packageName); //
//
for(int i=0;i<allClass.size();i++){
if(c.isAssignableFrom(allClass.get(i))){ //
if(!c.equals(allClass.get(i))){ //
returnClassList.add(allClass.get(i));
}
}
}
}catch (ClassNotFoundException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
}
return returnClassList;
}
// , jar
private static List<Class> getClasses(String packageName) throws ClassNotFoundException, IOException {
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
String path = packageName.replace('.', '/');
Enumeration<URL> resources = classLoader.getResources(path);
List<File> dirs = new ArrayList<File>();
while (resources.hasMoreElements()) {
URL resource = resources.nextElement();
dirs.add(new File(resource.getFile()));
}
ArrayList<Class> classes = new ArrayList<Class>();
for (File directory : dirs) {
classes.addAll(findClasses(directory, packageName));
}
return classes;
}
private static List<Class> findClasses(File directory, String packageName) throws ClassNotFoundException {
List<Class> classes = new ArrayList<Class>();
if (!directory.exists()) {
return classes;
}
File[] files = directory.listFiles();
for (File file : files) {
if (file.isDirectory()) {
assert !file.getName().contains(".");
classes.addAll(findClasses(file, packageName + "." + file.getName()));
} else if (file.getName().endsWith(".class")) {
classes.add(Class.forName(packageName + '.' +
file.getName().substring(0, file.getName().length() - 6)));
}
}
return classes;
}
}
알려 드 리 겠 습 니 다. 이 ClassUtils 는 보물 입 니 다. 쓸모 가 아주 큽 니 다. 하나의 인터페이스 에서 모든 실현 류 를 찾 을 수 있 고 아버지 류 에서 모든 자 류 를 찾 을 수 있 습 니 다. 이것 은 스스로 수정 하고 머리 를 써 서 생각해 보 세 요. 간단 합 니 다!완전한 유 도 는 다음 과 같다.
특히 createHuman () 을 늘 린 후 이 공장 의 확장 성 이 더 좋아 졌 는 지 정리 해 보 자.당신 은 인간 을 하나 더 추가 해 야 합 니 다. Human 인터페이스 가 계속 통합 되면 아무것도 수정 하지 않 아 도 생산 할 수 있 습 니 다. 구체 적 으로 얼마나 생산 되 는 지 는 팔괘 로 가 결정 해 야 합 니 다. 간단 한 공장 모델 은 이렇게 간단 합 니 다. 그러면 우 리 는 다시 한 가지 문 제 를 도입 하 겠 습 니 다. 사람 은 성별 이 있 습 니 다. 남자 와 여자 가 있 습 니 다. 당신 은 왜 다 르 지 않 습 니까? 서 두 르 지 마 세 요. 이것 은 다음 번 에 설명 을 들 어 보 겠 습 니 다!
공장 방법 모델 은 또 하나의 매우 중요 한 응용 이 있 는데 그것 이 바로 지연 시화 (Lazy initialization) 입 니 다. 무엇이 지연 시화 입 니까?대상 이 초기 화 된 후에 풀 리 지 않 습 니 다. 다시 사용 할 때 까지 기다 리 지 않 고 다시 초기 화 하지 않 아 도 됩 니 다. 메모리 에서 직접 받 으 면 됩 니 다. 어떻게 실현 합 니까? 간단 합 니 다. 예 를 들 어:
@SuppressWarnings("all")
public class HumanFactory {
// MAP, Human
private static HashMap<String,Human> humans = new HashMap<String,Human>();
// , , ,
public static Human createHuman(Class c){
Human human=null; //
try {
// MAP , ,
if(humans.containsKey(c.getSimpleName())){
human = humans.get(c.getSimpleName());
}else{
human = (Human)Class.forName(c.getName()).newInstance();
// MAP
humans.put(c.getSimpleName(), human);
}
} catch (InstantiationException e) {// , , ,
System.out.println(" ");
} catch (IllegalAccessException e) { // , , ...
System.out.println(" !");
} catch (ClassNotFoundException e) { // , ?!
System.out.println(" , !");
}
return human;
}
}
이 클래스 초기 화 는 자원 을 소모 하 는 경우 가 비교적 실 용적 입 니 다. 예 를 들 어 하드웨어 를 연결 하거나 하나의 클래스 를 초기 화하 기 위해 서 는 비교적 많은 조건 (매개 변수) 을 준비 해 야 합 니 다. 이런 방식 을 통 해 프로젝트 의 복잡 도 를 잘 줄 일 수 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
디자인 모델 의 공장 모델, 단일 모델자바 는 23 가지 디자인 모델 (프로 그래 밍 사상/프로 그래 밍 방식) 이 있 습 니 다. 공장 모드 하나의 공장 류 를 만들어 같은 인 터 페 이 스 를 실현 한 일부 종 류 를 인 스 턴 스 로 만 드 는 것...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.