1. 程式人生 > >spring 用到的九種設計模式

spring 用到的九種設計模式

1.簡單工廠模式

又叫做靜態工廠模式

簡單工廠模式實質是有一個工廠類根據傳入的引數,動態決定應該建立哪一個產品類。

<beans>     <bean id="singletonBean" class="com.itxxz.HelloItxxz">         <constructor-arg>             <value>Hello! 這是singletonBean!value>         </constructor-arg>    </ bean>     <bean id="itxxzBean
" class="com.itxxz.HelloItxxz"         singleton="false">         <constructor-arg>             <value>Hello! 這是itxxzBean! value>         </constructor-arg>     </bean> </beans> 2.工廠方法

通常由應用程式直接使用new建立新的想,為了將物件的建立和使用相分離,採用工廠模式,即應用程式將物件的建立及初始化職責交給工廠物件。

一般情況下,應用程式有自己的工廠物件來建立bean。如果將應用程式自己的工廠物件交給spring管理,那麼spring管理的就是普通的bean,而是工廠bean

import java.util.Random; public class StaticFactoryBean {       public static Integer createRandom() {            return new Integer(new Random().nextInt());        } } 建一個config.xm配置檔案,將其納入Spring容器來管理,需要通過factory-method指定靜態方法名稱 <bean id="random" class="example.chapter3.StaticFactoryBean" factory-method="createRandom" //createRandom方法必須是static的,才能找到 scope="prototype" /> 測試: public static void main(String[] args) {
      //呼叫getBean()時,返回隨機數.如果沒有指定factory-method,會返回StaticFactoryBean的例項,即返回工廠Bean的例項       XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource("config.xml"));       System.out.println("我是IT學習者建立的例項:"+factory.getBean("random").toString()); } 3.單例模式

保證一個類中只有一個例項,並提供一個訪問它的全域性訪問點。

4.介面卡

在spring的Aop中,使用的Advice來增強被代理類的功能。spring實現這一Aop功能的原理就使用代理模式(1.jdk動態代理 2.cglib位元組碼生成技術代理)對類進行方法級別的切面增強,

public interface AdvisorAdapter { boolean supportsAdvice(Advice advice);       MethodInterceptor getInterceptor(Advisor advisor); } MethodBeforeAdviceAdapter類Adapter class MethodBeforeAdviceAdapter implements AdvisorAdapter, Serializable {       public boolean supportsAdvice(Advice advice) {             return (advice instanceof MethodBeforeAdvice);       }       public MethodInterceptor getInterceptor(Advisor advisor) {             MethodBeforeAdvice advice = (MethodBeforeAdvice) advisor.getAdvice();       return new MethodBeforeAdviceInterceptor(advice);       } }

5.包裝器

在我們的專案中遇到這樣一個問題:我們的專案需要連線多個數據庫,而且不同的客戶在每次訪問中根據需要會去訪問不同的資料庫。我們以往在spring和hibernate框架中總是配置一個數據源,因而sessionFactory的dataSource屬性總是指向這個資料來源並且恆定不變,所有DAO在使用sessionFactory的時候都是通過這個資料來源訪問資料庫。但是現在,由於專案的需要,我們的DAO在訪問sessionFactory的時候都不得不在多個數據源中不斷切換,問題就出現了:如何讓sessionFactory在執行資料持久化的時候,根據客戶的需求能夠動態切換不同的資料來源?我們能不能在spring的框架下通過少量修改得到解決?是否有什麼設計模式可以利用呢? 
首先想到在spring的applicationContext中配置所有的dataSource。這些dataSource可能是各種不同型別的,比如不同的資料庫:Oracle、SQL Server、MySQL等,也可能是不同的資料來源:比如apache 提供的org.apache.commons.dbcp.BasicDataSource、spring提供的org.springframework.jndi.JndiObjectFactoryBean等。然後sessionFactory根據客戶的每次請求,將dataSource屬性設定成不同的資料來源,以到達切換資料來源的目的。
spring中用到的包裝器模式在類名上有兩種表現:一種是類名中含有Wrapper,另一種是類名中含有Decorator。基本上都是動態地給一個物件新增一些額外的職責。 

6.代理

為其他物件提供一種以控制對這個物件的訪問

7.觀察者

定義物件間的一種一對多的依賴關係,當一個物件的狀態發生改變時,所有依賴於它的物件得到通知並自動更新。8.

8.策略 9.模板