자바 프로젝트(5)-단일 모드의 응용 및 연구

4081 단어
단일 모드는 매우 독특한 모드로 다른 모드와 비교하는 사람이 드물다. 왜냐하면 단일 모드는 매우 간단하고 특별하기 때문이다. 하나의 클래스에 유일한 실례가 있고 전체적인 변수가 접근할 수 있도록 하는 것이 역할이다.이 클래스가 단 한 번만 실례화될 수 있도록 보장하는 방법은 구조 함수를 사유화하는 것이다. 그 자체를 제외하고는 새로운 대상을 new할 수 없다. 그리고 실례화된 과정을 클래스 자체의 공유 방법에 쓴다. 새로운 대상이 그 자체로만 판단하고 결정하는지 여부는 이미 하나의 실례가 있으면 이미 존재하는 대상을 직접 되돌려주고 새로운 실례가 없다.다른 종류는 하나의 대상을 실례화하려고 할 때 이 공유 방법을 조정한다.
4
  • 아사자식(사전 초기화 대상)
  •  // 
    Class XmlConfigReader{
    	private static XmlConfigReader instance=new XmlConfigReader();
    	private XmlConfigReader(){
    	}
    	public static XmlConfigReader getInstance(){
    		return instance;
    	}
    }

    4
  • 게으름뱅이식(지연 초기화 대상)
  •   // ( lazy)
    Class XmlConfigReader{   
    	 private static XmlConfigReader instance =null;
    	    public static synchronized XmlConfigReader getInstance(){
    			if(instance==null){
    				instance=new XmlConfigReader();
    			}
    			return instance;
    		}
    }

    우리는 흔히'Double-Check Locking'즉'이중 잠금'이라는 개념을 듣는다. 이것은 잠금을 추가하는 방식, 즉 Lock을 사용하기 때문이다.
    Class XmlConfigReader{
    	 private static XmlConfigReader instance;
    	private static readonly object syncRoot=new object();
    	private XmlConfigReader(){
    	}
    	public static XmlConfigReader getInstance(){
    	             
    		if(instance==null){
    			Lock( syncRoot) { 
    				if(instance==null){
    					instance=new XmlConfigReader();
    				}
    			}
    		}
    		return instance;
    	}
    }

    비교:
    단례 모델은 두 가지로 나뉘는데 이런 정적 초기화 방식은 클래스가 불러올 때 실례화되고 게으름뱅이가 처음 인용될 때 실례화되는 것보다 시스템 자원을 미리 차지하는 것이다.그러나 게으름뱅이는 자물쇠를 채워 다선정 방문의 안전성을 확보해야 하지만 굶주린 사람은 필요 없다.우리는 그 선자를 골라서 쓸 수밖에 없다.
     
    프로젝트의 단일 예제 적용:
    DRP에는 거의 모든 모듈에 Manager가 있습니다. 시스템 개발 초기에는 ClientManager만 있었으므로 다음과 같은 단일 모드를 사용했습니다.
    public class ClientManager {
    	private static ClientManager instance=new ClientManager();
    
    	private ClientManager(){}
    	
    	public static ClientManager getInstance(){
    		return instance;
    	}
    }

    시스템의 복잡도가 증가함에 따라
    ,
    점점 더 많이 나와요.
    Manager
    ,
    예컨대
    ItemManager,FlowCardManager
    등.
    ,
    그리고 이때
    Manager

    Dao
    분리를 했어요.
    ,
    계층화
    .
    시스템은 추상적인 공장을 채택했다
    +
    반사 기술 실현
    Manager
    종류
    Dao
    클래스의 실례화
    .
    일례로 또 공장에 응용되었다
    .
    public class BeanFactory {
    
    	private static BeanFactory instance=new BeanFactory();
    	
    	private final String beansConfigFile="beans-config.xml";
    	
    	private Document doc;
    
    	private BeanFactory(){
    		try {			
    			doc=new SAXReader().read(Thread.currentThread().getContextClassLoader().getResourceAsStream(beansConfigFile));
    		} catch (DocumentException e) {
    			e.printStackTrace();
    			throw new RuntimeException();
    		}
    	}
    	
    	public static BeanFactory getInstance(){
    		return instance;
    	}
    }

    아래의 이 코드는 공장 클래스에서 얻은 것이다
    Manager
    실현
    .
    처음에는 형원 모드인 줄 알았어요.
    ,
    그래서 이게 형원 모델보다 더 유연하게 이루어지는 거예요.
    .
    그것은 대상이 단지 하나의 실례만을 보장할 수 있다
    ,
    그래서 단일 모드의 응용이다
    .
    뒤에 가면 갈수록 더 많이 써요.
    ,
    이미 어떤 모델이나 기술에만 국한된 것이 아니다
    ,
    향원
    ,
    단례
    ,
    공장
    ,
    대리점
    ……
    // Service 
    private Map serviceMap=new HashMap();
    /**
    	 *  service 
    	 * @param beanId
    	 * @return
    	 */
    	public synchronized Object getServiceObject(Class c){
    		// , 
    		if(serviceMap.containsKey(c.getName())){
    			return serviceMap.get(c.getName());
    		}
    		Element beanElt=(Element)doc.selectSingleNode("//service[@id=\"" + c.getName() +"\"]");
    		String className=beanElt.attributeValue("class");
    		Object service=null;
    		try {
    			service=Class.forName(className).newInstance();
    			// map 
    			serviceMap.put(c.getName(), service);
    			
    		} catch (Exception e) {
    			throw new RuntimeException();
    		}
    		return service;
    	}

    위의 분석 및 적용을 통해 단일 사례 모델의 중점을 살펴봅니다.
    실현에 있어 사유 정적 구성원 변수/사유 구조 방법/공공의 정적 방법;전역 접근과 실례화 제어 문제를 해결했다.
    단례의 의미는 창설에 있지 않고 방문에 있다. 즉, 방문하거나 호출할 대상이 존재하지 않으면 하나를 창설한다. 이것은 유일한 것이고 이후에 다시 창설할 수 없다.존재하면 이 대상을 되돌려줍니다. 비록 이 대상의 속성은 재부여된 값이 수차례 바뀌었지만, 대상은 유일하지만 고정불변한 것이 아닙니다.

    좋은 웹페이지 즐겨찾기