디자인 모델 - 공장 모델 디 결합 실현

14304 단어 자바 입문
1. 결합 이란 무엇 인가
하나의 큰 프로그램 에서 여러 모듈 사이 에 의존 관계 가 존재 하 는데 그것 이 바로 결합 이다. 결합 은 불가피 하 다. 우리 가 해 야 할 일 은 가능 한 한 결합 도 를 낮 추고 높 은 내부 집적 저 결합 을 실현 하 는 코드 이다.예 를 들 어 자바 WEB 개발 에 자주 사용 되 는 3 층 구조, Controller 층, Service 층, Dao 층, Service 층 이 dao 층 방법 을 호출 하려 면 Service 층 에 Dao 층 인터페이스의 실현 대상 을 만들어 야 합 니 다. Service 층 에 Daocing 인터페이스 실현 류 의 대상 을 여러 가지 로 만 들 었 다 면 Dao 층 인터페이스 가 수정 되 었 을 때 Service 층 의 모든 종 류 를 일일이 수정 해 야 합 니 다.후기 유지 에 큰 문 제 를 일 으 켰 습 니 다.그래서 이 장 에서 우 리 는 공장 모델 이 이런 결합 을 어떻게 해결 하 는 지 소개 한다.
2. 전통 적 인 결합 이 풀 리 지 않 을 때
Dao 층 인터페이스 와 실현 클래스
//Dao   
public interface AccountDao {
     

    void saveAccount();
}
//Dao       
public class AccountDaoImpl implements AccountDao {
     
    @Override
    public void saveAccount() {
     
        System.out.println("        ......");
    }
}

Service 층 인터페이스 와 실현 클래스 는 Service 실현 클래스 에서 dao 층 의 실현 클래스 대상 을 만 들 고 결합 상황 이 발생 하 는 것 을 보 았 습 니 다.
//service   
public interface AccountService {
     
    //    
    void saveAccount();
}
//service       
public class AccountServiceImpl implements AccountService {
     
    //     ,   dao         
    private AccountDao accountDao= new AccountDaoImpl();
    @Override
    public void saveAccount() {
     
        //  dao        
        accountDao.saveAccount();
    }
}

3 공장 모드 해결 결합
  • 새 beans. xml 파일
  • <?xml version="1.0" encoding="utf-8" ?>
    <beans>
        <bean id="AccountDao" class="com.itheima.Dao.impl.AccountDaoImpl"/>
        <bean id="AccountService" class="com.itheima.service.impl.AccountServiceImpl"/>
    </beans>
    
  • 공장 류 공구 류 정의
  • public class BeanFactory {
         
        //    map  ,       ,    ,                        
        private static Map<String,Object> map=new HashMap<>();
        static{
         
    
            // beans.xml                 
            InputStream inputStream = BeanFactory.class.getClassLoader().getResourceAsStream("beans.xml");
            //  SAXReader  ,  read          ,  document  
            SAXReader saxReader=new SAXReader();
            try {
         
                Document document = saxReader.read(inputStream);
                //  document   getRootElement    beans    
                Element beans = document.getRootElement();
                //    bean       
                List<Element> beanList = beans.elements();
                //  beanList,
                for (Element bean : beanList) {
         
                    //  id    
                    String idValue = bean.attributeValue("id");
                    //  class    ,              
                    String classValue = bean.attributeValue("class");
                    //             
                    Class clazz = Class.forName(classValue);
                    //    
                    Object interfaceImplObj = clazz.newInstance();
                    // id        map   ,          beans.xml            
                    map.put(idValue,interfaceImplObj);
                }
            } catch (Exception e) {
         
                e.printStackTrace();
            }
        }
        //               
        public static Object getBean(String interfaceName){
         
    
            //      
            return map.get(interfaceName);
        }
    }
    
    
  • Service 인터페이스 실현 류 에서 공장 류 의 getBean 방법 을 호출 하여 AccountDao 인터페이스 실현 류 대상 을 성공 적 으로 얻 었 습 니 다.나중에 dao 층 의 실현 클래스 가 바 뀌 면 저 희 는 beans. xml 설정 파일 에서 응답 수정 만 하면 됩 니 다. Service 층 코드 를 조작 하지 않 아 도 디 결합 을 실현 합 니 다.
  • public class AccountServiceImpl implements AccountService {
         
    
        //      getBean  ,                
        private AccountDao accountDao= (AccountDao) BeanFactory.getBean("AccountDao");
    
        @Override
        public void saveAccount() {
         
    
            //  dao        
            accountDao.saveAccount();
        }
    }
    

    좋은 웹페이지 즐겨찾기