디자인 모델 에 대한 인식 (1)

3 대 디자인 모델
  • 창설 형 모델 (5 가지): 공장 방법 모델, 추상 공장 모델, 단일 모델, 건설 자 모델, 원형 모델
  • 구조 형 모델 (7 가지): 어댑터 모델, 장식 기 모델, 대리 모델, 외관 모델, 브리지 모델, 조합 모델, 향 원 모델
  • 행위 형 모델 (11 가지): 전략 모델, 템 플 릿 방법 모델, 관찰자 모델, 교체 서브 모델, 책임 체인 모델, 명령 모델, 비망록 모델, 상태 모델, 방문 자 모델, 중개 자 모델, 해석 기 모델
  • 디자인 모델 이 따 르 는 원칙
  • 개폐 원칙
  • 리 씨 교체 원칙
  • 후진 원칙 에 의존
  • 인터페이스 격 리 원칙
  • 디 미트 의 법칙
  • 단일 직책 원칙
  • Spring 의 디자인 모델
    단순 공장
    정적 공장 방법 (Static Factory Method) 모델 이 라 고도 부 르 지만 23 가지 GOF 디자인 모델 중 하나 에 속 하지 않 습 니 다.간단 한 공장 모델 의 실질 은 한 공장 류 가 들 어 오 는 매개 변수 에 따라 어떤 제품 류 를 만들어 야 하 는 지 동태 적 으로 결정 하 는 것 이다.Spring 의 BeanFactory 는 간단 한 공장 모델 의 구현 이다. 유일한 표지 가 들 어 오 면 bean 대상 을 얻 을 수 있 지만, 매개 변 수 를 들 어 온 후에 만 들 었 는 지, 매개 변 수 를 들 어 오기 전에 만 들 었 는 지 는 구체 적 인 상황 에 따라 결정 해 야 한다.다음 설정
    <beans>
        <bean id="bmwCar" class="cn.ltysyn.factoryMethod.CarStaticFactory" factory-method="getCar">
            <constructor-arg value="1">bmwCarconstructor-arg>           
        bean>
    
        <bean id="audiCar" class="cn.ltysyn.factoryMethod.CarStaticFactory" factory-method="getCar">
            <constructor-arg value="2">audiCarconstructor-arg>           
        bean>
    beans>

    공장 방법 (공장 방법)
    대상 을 만 드 는 데 사용 할 인 터 페 이 스 를 정의 하여 하위 클래스 가 어떤 종 류 를 예화 할 지 결정 합 니 다.Factory Method 는 클래스 의 실례 화 를 하위 클래스 로 지연 시 킵 니 다.Spring 의 Factory Bean 은 전형 적 인 공장 방법 모델 입 니 다.
    spring 에서 Bean Factory 와 Factory Bean 의 차이 점
    차이 점: BeanFactory 는 Factory, 즉 IOC 용기 나 대상 공장 이 고 Factory Bean 은 Bean 이다.스프링 에 서 는 모든 빈 을 빈 팩 토리 (즉 IOC 용기) 가 관리한다.그러나 Factory Bean 에 게 이 Bean 은 간단 한 Bean 이 아니 라 대상 을 생산 하거나 수식 하여 생 성 할 수 있 는 공장 Bean 입 니 다. 그의 실현 은 디자인 모델 중의 공장 모델 과 수식 기 모델 과 유사 합 니 다. factory Bean 은 beanfactory. getbean 에 해당 합 니 다. 이 돌아 온 bean 은 factory bean 에서 getObject 에서 돌아 온 대상 입 니 다.
    획득 에 대하 여
    만약 bean 을 testObject 라 고 한다 면 getBean ("testObject") 은 이 bean 을 가 져 오고, getBean ("& testObject") 은 Factory Bean 을 가 져 옵 니 다.
    // bean
    @Test
    public void test2() throws Exception{
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("factory-bean.xml");
        DBOperation dBoperation =  applicationContext.getBean("proxyDB",DBOperation.class);
        MysqlDBEntity dbEntity = new MysqlDBEntity();
        dBoperation.save(dbEntity);
    }
    
    // factoryBean
    @Test
    public void test2() throws Exception{
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("factory-bean.xml");
        FactoryBean factoryBean =  applicationContext.getBean("&proxyDB",FactoryBean.class);
        DBOperation db = (DBOperation)factoryBean.getObject();
        MysqlDBEntity dbEntity = new MysqlDBEntity();
        db.save(dbEntity);
    }
  • BeanFactory

  • BeanFactory 는 Factory 로 끝나 공장 류 (인터페이스) 로 bean 을 생산 하고 관리 하 는 공장 임 을 나타 낸다.Spring 에서 BeanFactory 는 IOC 용기 의 핵심 인터페이스 로 그 직책 은 실례 화, 포 지 셔 닝, 응용 프로그램의 대상 설정 과 이러한 대상 간 의 의존 을 구축 하 는 것 을 포함한다.BeanFactory 는 인터페이스 일 뿐 IOC 용기 의 구체 적 인 실현 은 아니 지만 Spring 용 기 는 Default Listable BeanFactory, XmlBeanFactory, Application Context 등 여러 가지 실현 을 보 여 주 었 다. 그 중에서 XmlBeanFactory 는 자주 사용 하 는 것 으로 XML 방식 으로 응용 대상 과 대상 간 의 의존 관 계 를 묘사 할 것 이다.XmlBeanFactory 류 는 이 XML 설정 메타 데 이 터 를 가지 고 있 으 며, 이 를 통 해 완전히 설정 가능 한 시스템 이나 응용 을 구축 할 것 입 니 다.
    BeanFactory 와 ApplicationContext 는 Spring 프레임 워 크 의 두 개의 IOC 용기 로 현재 일반적으로 ApplicationContext 를 사용 하고 있 으 며, BeanFactory 의 역할 을 포함 할 뿐만 아니 라 더 많은 확장 도 진행 하고 있다.
    Resource resource = new FileSystemResource("beans.xml");
    BeanFactory factory = new XmlBeanFactory(resource);
    
    ApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "applicationContext.xml", "applicationContext-part2.xml" });
    BeanFactory factory = (BeanFactory) context;
    
    // 接着使用 getBean(String beanName) 方法就可以取得 bean 的实例;
  • FactoryBean

  • 일반적인 상황 에서 Spring 은 반사 체 제 를 통 해 의 class 속성 지정 실현 류 의 사례 화 Bean 을 이용 하고 어떤 상황 에서 사례 화 Bean 과정 이 비교적 복잡 하 며 전통 적 인 방식 에 따라 에서 대량의 배치 정 보 를 제공 해 야 한다.설정 방식 의 유연성 은 제한 을 받는다. 이때 인 코딩 방식 을 사용 하면 간단 한 방안 을 얻 을 수 있다.Spring 은 이 를 위해 org. spring from work. bean. factory. Factory Bean 의 공장 류 인 터 페 이 스 를 제공 합 니 다. 사용 자 는 이 인 터 페 이 스 를 통 해 빈 의 논 리 를 맞 출 수 있 습 니 다.Factory Bean 인 터 페 이 스 는 Spring 프레임 워 크 에 있어 중요 한 위 치 를 차지 하고 Spring 자체 가 70 여 개의 Factory Bean 의 실현 을 제공 합 니 다.그것들 은 복잡 한 Bean 의 세부 사항 을 실례 화하 여 상부 응용 에 편 의 를 가 져 왔 다.Spring 3.0 부터 Factory Bean 은 범용 을 지원 하기 시작 했다. 즉, 인터페이스 성명 을 Factory Bean 의 형식 으로 바 꾸 어 Bean 으로 끝 나 는 것 은 Bean 임 을 나타 낸다. 일반 Bean 과 달리 Factory Bean 인 터 페 이 스 를 실현 한 Bean 이다. 이 Bean 의 ID 에 따라 Bean Factory 에서 얻 은 것 은 실제 Factory Bean 의 getObject () 가 돌아 오 는 대상 이다.Factory Bean 자체 가 아 닌 Factory Bean 대상 을 가 져 오 려 면 id 앞 에 & 기 호 를 추가 하여 가 져 오 십시오.
  • 종합
  • 둘 다 인터페이스
  • BeanFactory 인 터 페 이 스 를 실현 하 는 유형 은 이런 일 을 나타 내 는 공장 으로 각종 Bean
  • 을 배치, 신축, 관리 하 는 역할 을 한다.
  • 에 따 르 면 Factory Bean 을 실현 하 는 유형 은 이런 것 도 하나의 Bean 이 고 유형 은 공장 Bean (Spring 에는 모두 두 가지 bean 이 있 으 며 하 나 는 일반 bean 이 고 다른 하 나 는 공장 bean) 이다.말 그대로 빈 을 관리 하 는 데 도 쓰 이 고 그 자 체 는 스프링 이 관리한다.

  • 하나의 Bean 이 실현 하려 면 다음 과 같은 세 개의 인 터 페 이 스 를 실현 해 야 한다.
    Object getObject():返回由FactoryBean创建的Bean的实例
    boolean isSingleton():确定由FactoryBean创建的Bean的作用域是singleton还是prototype;
    getObjectType():返回FactoryBean创建的Bean的类型。

    한 가지 주의 할 점 이 있 습 니 다. Factory Bean 을 실현 한 클래스 를 Spring 컨 텍스트 에 성공 적 으로 설정 하면 이러한 대상 의 이름 (예 를 들 어 apple Factory Bean) 을 통 해 Spring 의 applicationContext 나 bean Factory 에서 bean 을 가 져 올 때 apple Factory Bean 이 만 든 애플 인 스 턴 스 를 가 져 옵 니 다.Spring 을 통 해 애플 팩 터 리 빈 을 얻 으 려 면 이름 앞 에 & 기 호 를 추가 해 야 합 니 다.
    단일 모드 (Singleton)
  • 하나의 인 스 턴 스 만 있 고 전체 방문 점 을 제공 합 니 다.

  • spring 의 단일 모드 는 후반 구 를 완 성 했 습 니 다. 즉, 전체적인 방문 점 인 Bean Factory 를 제공 합 니 다.그러나 구조 기 단계 에서 단일 예 를 제어 하지 않 았 습 니 다. 이것 은 spring 관리 가 임의의 자바 대상 이기 때 문 입 니 다.핵심 힌트: Spring 에서 기본 bean 은 모두 singleton 으로 FactoryBean 또는 singleton="true|false" 을 통 해 지정 할 수 있 습 니 다.
    모든 단일 모드 는 정적 방법 으로 만 들 어 졌 기 때문에 단일 대상 은 메모리 에 정적 공유 구역 에 저 장 됩 니 다.
    게으름뱅이 식 과 굶 주 린 사람 식
  • 게으름뱅이 식 단일 모드: 클래스 로 딩 시 초기 화 되 지 않 습 니 다.
  • 굶 주 린 한식 단일 모드: 클래스 로 딩 시 초기 화 를 완 료 했 기 때문에 클래스 로 딩 이 느 리 지만 대상 을 얻 는 속도 가 빠르다.

  • 게으름뱅이
    // 懒汉,线程不安全
    public class SingletonDemo1 {
    
        private static SingletonDemo1 instance;
    
        private SingletonDemo1() {}
    
        public static SingletonDemo1 getInstance() {
            if (instance == null) {
                instance = new SingletonDemo1();
            }
            return instance;
        }
    
    }
    
    // 线程安全
    public class SingletonDemo2 {
    
        private static SingletonDemo2 instance;
    
        private SingletonDemo2() {}
    
        public static synchronized SingletonDemo2 getInstance() {
            if (instance == null) {
                instance = new SingletonDemo2();
            }
            return instance;
        }
    
    }

    굶 주 린 한식 일례 모델
    /**
     * 基于classloder机制避免了多线程的同步问题
     * instance 在类装载时就实例化,这时候初始化 instance 显然没有达到 lazy loading 的效果
     */
    public class SingletonDemo3 {
    
        private static SingletonDemo3 instance = new SingletonDemo3();
    
        private SingletonDemo3() {}
    
        public static SingletonDemo3 getInstance() {
            return instance;
        }
    
    }

    좋은 웹페이지 즐겨찾기