디자인 모델 노트 공장 모델 - 단순 공장 모델 (Simple Factory Pattern)

4250 단어 디자인 모드
1. 개술:
공장 모델 은 대량의 공동 인터페이스 가 있 는 유형 을 예화 하 는 것 을 전문 적 으로 책임 지고 매번 어떤 유형의 모델 을 예화 해 야 하 는 지 미리 알 필요 가 없다.이것 은 대상 을 만 드 는 데 사용 할 인 터 페 이 스 를 정의 합 니 다. 하위 클래스 에서 어떤 종 류 를 예화 할 지 결정 합 니 다.
2. 간단 한 공장 모델 의 구조:
3. 간단 한 실례:
1. 하나의 인 터 페 이 스 를 정의 하고 자바 비 안 을 대표 합 니 다.
public interface UserDao {
 public void save();
}

2. UserDao 의 실현 클래스 정의:
public class UserDaoWithMySql implements UserDao{
 public void save(){
  System.out.println("mysql save");
 }
}
public class UserDaoWithOracle implements UserDao{
 public void save(){
  System.out.println("Oracle Save!");
 }
}

3. UserDao 를 만 드 는 공장 을 정의 합 니 다.
/**
 *     UserDao   
 * @author yu
 *
 */
public class UserDaoFactory {
 public static UserDao create(){
//  return new UserDaoWithMySql();
  return new UserDaoWithOracle();
 }
}

4. 테스트:
UserDao ud = UserDaoFactory.create();
  ud.save();

사용 할 때 서로 다른 실현 류 를 얻 으 려 면 UserDao Factory 의 반환 값 만 바 꾸 면 되 지만 유연성 이 부족 합 니 다. 다음 의 예 를 보 세 요.
4. Bean 을 불 러 오 는 BeanFactory 가 지 연 됩 니 다.
1. properties 파일 정의: bean. properties:
mysql=com.cxy.factory.simple.UserDaoWithMySql
oracle=com.cxy.factory.simple.UserDaoWithOracle
2. BeanFactory (BeanFactory lazy) 정의:
package com.cxy.factory.simple;

import java.io.IOException;
import java.util.Properties;

public class BeanFactory_lazy {
  private static Properties pro;
  static{
     pro = new Properties();
     try {
       //  properties  
       pro.load(BeanFactory_lazy.class.getClassLoader().getResourceAsStream("bean.properties"));
     } catch (IOException e) {
       e.printStackTrace();
     }
  }
  public static UserDao getBean(String key){
     if(pro.containsKey(key)){
       String className = pro.getProperty(key);
       try {
          return (UserDao) Class.forName(className).newInstance();
       } catch (InstantiationException e) {
          e.printStackTrace();
       } catch (IllegalAccessException e) {
          e.printStackTrace();
       } catch (ClassNotFoundException e) {
          e.printStackTrace();
       }
       return null;
     }else{
       throw new IllegalArgumentException();
     }
  }
}
 

3. 테스트:
UserDao ud = BeanFactory_lazy.getBean("oracle");
ud.save();
실제 응용 에서 필요 에 따라 getBean () 방법 에 서로 다른 파 라 메 터 를 입력 하면 서로 다른 Bean 을 얻 을 수 있 습 니 다.
위의 코드 에서 Bean 을 유연 하 게 가 져 오 는 방법 을 실 현 했 지만 Bean 을 사용 할 때 만 해당 하 는 Bean 을 예화 할 수 있 습 니 다. 가끔 은 Bean Factory 를 초기 화 할 때 설정 한 Bean 을 모두 만 들 고 싶 습 니 다. 아래 코드 를 보 세 요. 4. 지연 되 지 않 고 추가 되 는 Bean Factory.
package com.cxy.factory.simple;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.Map.Entry;

public class BeanFactory {
  private static Properties pro;
  //    properties      
  private static Map map = new HashMap();
  static{
     pro = new Properties();
     try {
       pro.load(BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties"));
     } catch (IOException e) {
       e.printStackTrace();
     }
     //   properties  ,       map 
     for(Entry entry : pro.entrySet() ){
       String key = (String) entry.getKey();
       String className = (String) entry.getValue();
       try {
          Object userDao = Class.forName(className).newInstance();
          map.put(key, userDao);
       } catch (InstantiationException e) {
          e.printStackTrace();
       } catch (IllegalAccessException e) {
          e.printStackTrace();
       } catch (ClassNotFoundException e) {
          e.printStackTrace();
       }
     }
  }
  public static UserDao getBean(String key){
     if(map.containsKey(key)){
       return (UserDao) map.get(key);
     }else{
       throw new IllegalArgumentException();
     }
  }
}
 
빈 을 예화 하 는 절 차 를 static 정적 블록 에 넣 으 면 이 종 류 를 예화 하기 전에 모든 빈 대상 을 만 들 고 사용 할 때 직접 가 져 가면 됩 니 다.
위의 코드 는 Spring 에서 BeanFactory 의 간단 한 실현 입 니 다. 다만 Spring 은 Xml 프로필 을 사용 합 니 다. 이것 은 상 관 없 이 원리 가 가장 중요 하고 실현 경 로 는 그 다음 입 니 다.

좋은 웹페이지 즐겨찾기