디자인 모델 -- 공장 방법 모델 [공장 방법 패턴]

성명: 본 고 는 인터넷 서적 에서 정 리 된 것 이지 오리지널 이 아니다.
여 와 가 사람 을 만들다.
여 와 는 보충 한 후에 인간 세상 에 내 려 가 보 았 다. 와 싸, 풍경 이 너무 아름 다 웠 다. 하늘 은 짙 푸 르 고 물 은 맑 았 다. 공 기 는 맑 고 너무 아름 다 웠 다. 그리고 시간 이 지나 면 좀 외 로 웠 다. 동물 이 없 었 다. 이런 것들 은 모두 정태 적 인 것 이 었 다. 어 떡 하지?
신선 이라는 것 을 잊 지 마 세 요. 할 수 없 는 일이 없어 요. 그래서 여 와 는 팔괘 로 (기술 용어: 공장 설립) 를 세 워 사람 을 만 들 기 시 작 했 습 니 다. 구체 적 인 과정 은 이 렇 습 니 다. 먼저 진흙 을 빚 은 다음 에 팔괘 로 에 구 운 다음 에 바닥 에 던 져 서 자 랐 습 니 다. 그러나 의외로 항상 생산 되 었 습 니 다.
처음 구 운 토우, 지 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈
두 번 째 토우 구 이, 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈 즈
세 번 째 토우 구 이, 즈 ~ 즈 ~ 즈 ~, 구 우 면서 지 켜 봐, 헤 이, 딱 좋아, 퍼 펙 트!우수, 노란색 인간!
이 과정 은 비교적 재 미 있 습 니 다. 먼저 유형 도 를 보 세 요.
프로그램 으로 구현 하고 인간 의 총칭 을 먼저 정의 합 니 다.
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; 
    } 
} 

이 클래스 초기 화 는 자원 을 소모 하 는 경우 가 비교적 실 용적 입 니 다. 예 를 들 어 하드웨어 를 연결 하거나 하나의 클래스 를 초기 화하 기 위해 서 는 비교적 많은 조건 (매개 변수) 을 준비 해 야 합 니 다. 이런 방식 을 통 해 프로젝트 의 복잡 도 를 잘 줄 일 수 있 습 니 다.

좋은 웹페이지 즐겨찾기