原則1:考慮用靜態(tài)工廠方法代替公有構(gòu)造器
-
提供實(shí)例的方式:
- 靜態(tài)工廠方法(非設(shè)計(jì)模式中的靜態(tài)工廠模式)
- 公有構(gòu)造器new
-
靜態(tài)工廠方法的優(yōu)勢(shì)
- 能表明返回值含義的方法名稱:如new BigInteger(int,int,random),BigInteger.probablePrime(),兩者都是大概率返回一個(gè)素?cái)?shù)淑翼,但是公有構(gòu)造器的方式無(wú)法表明返回值的類型
- 減少實(shí)例的創(chuàng)建:如Boolean.valueof,Long.valueof(-128<= x< =128)都會(huì)緩存常用對(duì)象答捕,提升性能
- 返回值類型可以是子類:公有構(gòu)造器凡是返回類型只能是一種,靜態(tài)工廠方式返回子類捣炬,在代碼升級(jí)時(shí)蛋欣,返回的子類更改成更高性能的子類丐巫,用戶無(wú)感知锨侯。
- 適合基于接口的框架:Collections,ElumSet,服務(wù)提供者框架
-
服務(wù)提供者框架
- 理解:以應(yīng)用市場(chǎng)為例,一個(gè)公司提供通過(guò)應(yīng)用市場(chǎng)向用戶提供某個(gè)APP捂刺,在此框架中谣拣,存在服務(wù)接口,具體服務(wù)族展,服務(wù)提供者接口森缠,具體服務(wù)提供者,服務(wù)管理者仪缸,分別對(duì)應(yīng)app接口贵涵,具體某個(gè)APP:A,公司接入應(yīng)用市場(chǎng)接口恰画,公司B宾茂,應(yīng)用市場(chǎng)。公司B要向用戶提供A這個(gè)服務(wù)拴还,但用戶不會(huì)直接通過(guò)公司B去獲取這項(xiàng)服務(wù)跨晴,而是通過(guò)平臺(tái),那么平臺(tái)就規(guī)定片林,要提供服務(wù)必須按照我的平臺(tái)標(biāo)準(zhǔn)接口來(lái)接入端盆,服務(wù)A要實(shí)現(xiàn)服務(wù)接口,公司B要實(shí)現(xiàn)服務(wù)提供者接口费封,so當(dāng)用戶搜索某個(gè)服務(wù)時(shí)爱谁,平臺(tái)找到對(duì)應(yīng)的服務(wù)提供者并返回其服務(wù)。用戶不用擔(dān)心多種服務(wù)使用方式不一致孝偎,平臺(tái)強(qiáng)制了公司B按服務(wù)接口和服務(wù)提供者接口提供服務(wù),確保了用戶可直接按服務(wù)接口定義的方式去使用服務(wù)凉敲,所有服務(wù)使用方式一致衣盾;
- 組成:IService,ConcreteSerVice爷抓,IProvider势决,ConcreteProvider,ProviderManager(platform)
public class main {
public static void main(String[] args) {
ServicePlatform.registerProvider(new LoginProvider());
IService service = ServicePlatform.getService("login");
service.startService();
service.stopService();
Long long1 = Long.valueOf(1);
System.out.println(long1);
}
}
public interface IService {
void startService();
void stopService();
}
public class LoginService implements IService {
@Override
public void startService() {
System.out.println("start login sercice");
}
@Override
public void stopService() {
System.out.println("stop login service");
}
}
public interface IServiceProvider {
IService getService();
String getServiceName();
}
public class LoginProvider implements IServiceProvider {
@Override
public IService getService() {
return new LoginService();
}
@Override
public String getServiceName() {
return "login";
}
}
public class ServicePlatform {
private static Map<String, IServiceProvider> map = new HashMap<>();
public static void registerProvider(IServiceProvider provider) {
if (!map.containsKey(provider.getServiceName())) {
map.put(provider.getServiceName(), provider);
}
}
public static IService getService(String name) {
return map.get(name).getService();
}
}
- 總結(jié):new前三思靜態(tài)工廠方法