논리적 설명:
이제 레이어 B와 레이어 D에 인터페이스 레이어를 추가하고 팩토리를 사용하려고 합니다. 그리고 B의 생성과 D의 생성을 두 개의 시리즈로 간주하고 추상 팩토리를 사용하여 이를 생성할 수 있습니다.
구성 파일: beans-config.xml. service-class와 dao-class는 각각 두 가지 제품 시리즈에 해당합니다. 하위 메뉴의 id는 인터페이스의 네임스페이스에 해당하고, 클래스는 구현 클래스의 네임스페이스에 해당합니다.
다음과 같이 코드 코드를 복사합니다.
[html] 일반 카피프린트를 보시겠습니까?
<?xml version="1.0" 인코딩="UTF-8"?>
<콩>
<서비스 클래스>
<service id="com.xxjstgb.drp.basedata.manager.ItemManager" />
<service id="com.xxjstgb.drp.flowcard.manager.FlowCardManager" />
</서비스 클래스>
<다오클래스>
<dao id="com.xxjstgb.drp.basedata.dao.ItemDao" />
<dao id="com.xxjstgb.drp.flowcard.dao.FlowCardDao" />
</dao-class>
</beans>
추상 팩토리 : BeanFactory. 구성 파일을 읽어 관련 객체를 얻고, 관련 생성된 객체를 Map에 저장합니다.
다음과 같이 코드 코드를 복사합니다.
[java] 일반 카피프린트를 보시겠습니까?
패키지 com.xxjstgb.drp.util;
java.util.HashMap 가져오기;
java.util.Map 가져오기;
//dom4j
org.dom4j.Document 가져오기;
import org.dom4j.DocumentException;
org.dom4j.Element 가져오기;
org.dom4j.io.SAXReader 가져오기;
import com.xxjstgb.drp.basedata.dao.ItemDao;
com.xxjstgb.drp.basedata.manager.ItemManager를 가져옵니다.
com.xxjstgb.drp.flowcard.dao.FlowCardDao 가져오기;
com.xxjstgb.drp.flowcard.manager.FlowCardManager 가져오기;
/**
* 추상 공장은 주로 두 가지 제품 시리즈를 생산합니다.
* 1. 매니저 시리즈
* 2. Dao 시리즈 제품
* @author liuzhengquan
*
*/
공개 클래스 BeanFactory {
개인 정적 BeanFactory 인스턴스=new BeanFactory();
//시스템 기본 구성 파일 이름
개인 최종 문자열 beansConfigFile="beans-config.xml";
//Dao 관련 객체 저장
개인 문서 문서;
/*
* 구성 파일의 key=id 값
* 값=ID에 해당하는 객체
*/
private Map serviceMap = new HashMap();//서비스 관련 객체 저장
private Map daoMap = new HashMap();//Dao 관련 객체 저장
개인 BeanFactory(){
노력하다 {
doc=new SAXReader().read(Thread.currentThread().getContextClassLoader().getResourceAsStream(beansConfigFile));
} 잡기(DocumentException e) {
e.printStackTrace();
새로운 RuntimeException()을 던져라;
}
}
공개 정적 BeanFactory getInstance(){
반환 인스턴스;
}
/**
* 제품번호에 따라 서비스 시리즈 제품 획득
* @param 서비스 ID
* @반품
*/
공용 동기화 객체 getServiceObject(클래스 c){
//관련된 객체 인스턴스가 있으면 반환
if(serviceMap.containsKey(c.getName())){
return serviceMap.get(c.getName());
}
요소 beanElt=(Element)doc.selectSingleNode("//service[@id=/""+ c.getName() + "/"]");
String className=beanElt.attributeValue("클래스");
개체 서비스=null;
노력하다 {
service=Class.forName(className).newInstance();
//생성된 객체를 맵에 넣습니다.
serviceMap.put(c.getName(), 서비스);
} 잡기(예외 e) {
새로운 RuntimeException()을 던져라;
}
반품 서비스;
}
/**
* 제품번호에 따라 Dao 시리즈 제품을 획득하세요
* @param daoId
* @반품
*/
공개 동기화 객체 getDaoObject(클래스 c){
//관련된 객체 인스턴스가 있으면 반환
if(daoMap.containsKey(c.getName())){
return daoMap.get(c.getName());
}
요소 beanElt=(Element)doc.selectSingleNode("//dao[@id=/""+c.getName()+"/"]");
String className=beanElt.attributeValue("클래스");
개체 dao=null;
노력하다 {
dao=Class.forName(className).newInstance();
//생성된 객체를 맵에 넣습니다.
daoMap.put(c.getName(), dao);
} 잡기(예외 e) {
새로운 RuntimeException()을 던져라;
}
다오를 반환;
}
/**
* 시험
* @param 인수
*/
공개 정적 무효 메인(문자열[] 인수){
ItemManager itemManager=(ItemManager)BeanFactory.getInstance().getServiceObject(ItemManager.class);
System.out.println("itemManager"+itemManager);
ItemDao itemDao=(ItemDao)BeanFactory.getInstance().getDaoObject(ItemDao.class);
System.out.println("itemDao:"+itemDao);
FlowCardManager flowCardManager=(FlowCardManager)BeanFactory.getInstance().getServiceObject(FlowCardManager.class);
//FlowCardManager flowCardManager=new FlowCardManagerImpl();
System.out.println(flowCardManager);
FlowCardDao flowCardDao=(FlowCardDao)BeanFactory.getInstance().getDaoObject(FlowCardDao.class);
//FlowCardDao flowCardDao=new FlowCardDaoImpl();
System.out.println("flowCardDao:"+flowCardDao);
}
}