静态工厂方法之服务提供者框架
靜態(tài)工廠返回的對(duì)象所屬的類(lèi),在編寫(xiě)包含該靜態(tài)工廠方法的類(lèi)的時(shí)候,可以不必存在.這種靈活的靜態(tài)工廠方法構(gòu)成了服務(wù)提供者框架的基礎(chǔ),例如JDBC的API.服務(wù)提供者框架是指這樣一個(gè)系統(tǒng):多個(gè)服務(wù)提供者實(shí)現(xiàn)一個(gè)服務(wù),系統(tǒng)為服務(wù)提供者的客戶(hù)端提供多個(gè)實(shí)現(xiàn).并把它們從多個(gè)實(shí)現(xiàn)中解耦出來(lái).
服務(wù)提供者框架包含四大組件-服務(wù)接口(提供者實(shí)現(xiàn)),提供者注冊(cè)API(由系統(tǒng)用來(lái)注冊(cè)實(shí)現(xiàn)),服務(wù)訪問(wèn)API(客戶(hù)端用來(lái)訪問(wèn)服務(wù)的實(shí)例),服務(wù)提供者接口(服務(wù)者負(fù)責(zé)創(chuàng)建其服務(wù)實(shí)現(xiàn)的實(shí)例).下面的例子就是服務(wù)提供者框架的具體實(shí)現(xiàn):
首先是服務(wù)接口和服務(wù)提供者接口,服務(wù)提供者用來(lái)產(chǎn)生服務(wù):
/*** * @author 胡龍海* 創(chuàng)建時(shí)間: 2017年4月4日* 服務(wù)接口*/ public interface Service {//Service方法.public void doService(); } /*** * @author 胡龍海* 創(chuàng)建時(shí)間: 2017年4月4日* 服務(wù)提供者接口*/ public interface Provider {public Service newService(); }緊接著是服務(wù)提供者接口的實(shí)現(xiàn)和服務(wù)接口的實(shí)現(xiàn):
public class StrongProvider implements Provider{@Overridepublic Service newService() {return new StrongService();}} public class WeekProvider implements Provider{@Overridepublic Service newService() {return new WeekService();}} public class WeekService implements Service{@Overridepublic void doService() {System.out.println("弱爆了");}} public class StrongService implements Service{@Overridepublic void doService() {System.out.println("雙擊666");}}緊接著就是提供靜態(tài)工廠了,我們通過(guò)靜態(tài)工廠完成服務(wù)訪問(wèn)API,服務(wù)提供者注冊(cè)API的編寫(xiě):
/*** 靜態(tài)工廠,提供服務(wù)* @author 胡龍海* 創(chuàng)建時(shí)間: 2017年4月4日*/ public class Services {private Services(){} //保證該類(lèi)是不可實(shí)例化的private static Map<String,Provider> providers=new HashMap<>();//一系列服務(wù)提供者private static String DEFAULT_PROVIDER_NAME="<def>";/*** 提供者注冊(cè)API.(默認(rèn))* @author 胡龍海* 創(chuàng)建時(shí)間: 2017年4月4日* @param provider*/public static void registDefaultProvider(Provider provider) {providers.put(DEFAULT_PROVIDER_NAME, provider);}/*** 提供者注冊(cè)API* @author 胡龍海* 創(chuàng)建時(shí)間: 2017年4月4日* @param providerName* @param provider*/public static void registProvider(String providerName,Provider provider) {providers.put(providerName, provider);}/*** 服務(wù)訪問(wèn)API,默認(rèn)* @author 胡龍海* 創(chuàng)建時(shí)間: 2017年4月4日* @return*/public static Service newService() {return providers.get(DEFAULT_PROVIDER_NAME).newService();}/*** 服務(wù)訪問(wèn)API.* @author 胡龍海* 創(chuàng)建時(shí)間: 2017年4月4日* @param serviceName* @return*/public static Service newService(String serviceName) {return providers.get(serviceName).newService();} }接著,我們就可以建立代碼去測(cè)試了.可以去注冊(cè)幾個(gè)服務(wù)提供者,然后根據(jù)注冊(cè)時(shí)的名字完成對(duì)于服務(wù)的調(diào)用.
public class TestService {@Testpublic void testService() {Services.registProvider("week",new WeekProvider());Services.registProvider("strong", new StrongProvider());Services.registDefaultProvider(new StrongProvider());Services.newService().doService();Services.newService("week").doService();} }實(shí)際上,我們熟悉的JDBC編程就是基于這種服務(wù)提供者框架去實(shí)現(xiàn)的,其中Driver是服務(wù)提供者接口,Connection是服務(wù)接口,DriverManager.registDriver()是服務(wù)提供者注冊(cè)API,而DriverManager.getConnection()是服務(wù)訪問(wèn)API.
轉(zhuǎn)載于:https://www.cnblogs.com/hlhdidi/p/6666254.html
總結(jié)
以上是生活随笔為你收集整理的静态工厂方法之服务提供者框架的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: textmetric结构
- 下一篇: P2597 [ZJOI2012]灾难(t