디자인 모델 --- 공장 방법 모델 (factory method pattern)

7635 단어 Pattern
하나의 공장 종 류 를 정 하고 이 공장 류 로 한 무더기 의 대상 을 만 들 었 는데 이런 대상 이 대응 하 는 종 류 는 같은 인 터 페 이 스 를 실현 했다.
Human. java 는 인터페이스 클래스 로 구체 적 인 코드 는 다음 과 같 습 니 다.

 package com.designPattern.factoryMethod;

  public interface Human {

	public void laugh();
	
	public void cry();
	
	public void talk();
}


Human 인터페이스의 구체 적 인 실현 유형 은 다음 과 같다.
BlackHuman. java 코드 는 다음 과 같 습 니 다.

package com.designPattern.factoryMethod;

public class BlackHuman  implements Human{

	@Override
	public void laugh() {
		System.out.println("      !");
	}

	@Override
	public void cry() {
		System.out.println("      !");
	}

	@Override
	public void talk() {
		System.out.println("       !");
	}

}


WhiteHuman. java 코드 는 다음 과 같 습 니 다.

 package com.designPattern.factoryMethod;

public class WhiteHuman implements Human{

	@Override
	public void laugh() {
		System.out.println("      !");
	}

	@Override
	public void cry() {
		System.out.println("      !");
	}

	@Override
	public void talk() {
		System.out.println("       !");
	}
	
}


YellowHuman. java 코드 는 다음 과 같 습 니 다:

package com.designPattern.factoryMethod;

public class YellowHuman implements Human{

	@Override
	public void laugh() {
		System.out.println("      !");
	}

	@Override
	public void cry() {
		System.out.println("      !");
	}

	@Override
	public void talk() {
		System.out.println("       !");
	}

}


공장 류 HumanFactory. java 코드 는 다음 과 같 습 니 다.

package com.designPattern.factoryMethod;

import java.util.List;
import java.util.Random;

public class HumanFactory {
	
	public static Human createHuman(Class c){
		Human human = null;
		try{
			human = (Human)Class.forName(c.getName()).newInstance();
		}catch(Exception e){
			e.printStackTrace();
		}
		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;
	}

}


공장 클래스 에 사용 되 는 도구 클래스 ClassUtils. java 코드 는 다음 과 같 습 니 다.

package com.designPattern.factoryMethod;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;

public class ClassUtils {
	
	@SuppressWarnings("rawtypes")
	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++){
					//isAssignableFrom                            
					//     if     Human        
					if(c.isAssignableFrom(allClass.get(i))){
						if(!c.equals(allClass.get(i))){
							returnClassList.add(allClass.get(i));
						}
					}
				}
			}catch(Exception e){
				e.printStackTrace();
			}
		}
		return returnClassList;
	}
	
	private static List<Class> getClasses(String packageName) throws ClassNotFoundException,IOException {
		
		ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
		String path = packageName.replace('.', '/');
		//  :   path      ,       %20,      
		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;
	}

}


공장 클래스 의 호출 클래스 NvWa. java 코드 는 다음 과 같 습 니 다.

 package com.designPattern.factoryMethod;

public class NvWa {
	
	public static void main(String[] args) throws Exception{
		System.out.println("----------------       :  ---------------------");
		Human whiteHuman = HumanFactory.createHuman(WhiteHuman.class);
		whiteHuman.laugh();
		whiteHuman.cry();
		whiteHuman.talk();
		System.out.println("----------------       :  ---------------------");
		Human blackHuman = HumanFactory.createHuman(BlackHuman.class);
		blackHuman.laugh();
		blackHuman.cry();
		blackHuman.talk();
		System.out.println("----------------       :    ---------------------");
		Human yellowHuman = HumanFactory.createHuman(YellowHuman.class);
		yellowHuman.laugh();
		yellowHuman.cry();
		yellowHuman.talk();
		
		for(int i=0;i<10;i++){
			System.out.println("    ");
			Human human = HumanFactory.createHuman();
			human.cry();
			human.laugh();
			human.talk();
		}
		}

}


실행 결 과 는 다음 과 같 습 니 다.

----------------       :  ---------------------
      !
      !
       !
----------------       :  ---------------------
      !
      !
       !
----------------       :    ---------------------
      !
      !
       !
    
      !
      !
       !
    
      !
      !
       !
    
      !
      !
       !
    
      !
      !
       !
    
      !
      !
       !
    
      !
      !
       !
    
      !
      !
       !
    
      !
      !
       !
    
      !
      !
       !
    
      !
      !
       !


좋은 웹페이지 즐겨찾기