西安購物網(wǎng)站建設(shè)2022年新聞熱點事件
1.抽象工廠模式定義:
抽象工廠模式提供了一個創(chuàng)建一系列相關(guān)或者相互依賴對象的接口,無需指定它們具體的類
2.抽象工廠模式適用場景:
- 客戶端(應(yīng)用層)不依賴于產(chǎn)品類實例如何被創(chuàng)建、實現(xiàn)等細節(jié)
- 強調(diào)一系列相關(guān)的產(chǎn)品對象(屬于同一產(chǎn)品族)一起使用創(chuàng)建對象需要大量的重復代碼
- 提供一個產(chǎn)品類的庫,所有的產(chǎn)品以同樣的接口出現(xiàn),從而使得客戶端不依賴于具體的實現(xiàn)
3.抽象工廠模式的優(yōu)缺點:
優(yōu)點:
- 具體產(chǎn)品在應(yīng)用層的代碼隔離,無需關(guān)心創(chuàng)建的細節(jié)
- 將一個系列的產(chǎn)品統(tǒng)一到一起創(chuàng)建
缺點:
- 規(guī)定了所有可能被創(chuàng)建的產(chǎn)品集合,產(chǎn)品簇中擴展新的產(chǎn)品困難
- 增加了系統(tǒng)的抽象性和理解難度
創(chuàng)建一個手機接口 cn.xs.abstraction.IPhoneProduct
代碼如下:
public interface IPhoneProduct {
/**
* 開機
*/
void open();
/**
* 關(guān)機
*/
void close();
/**
* 發(fā)短信
*/
void send();
/**
* 打電話
*/
void call();
}
創(chuàng)建一個路由器接口 cn.xs.abstraction.IRouterProduct
代碼如下:
public interface IRouterProduct {
/**
* 開機
*/
void open();
/**
* 關(guān)機
*/
void close();
/**
* 設(shè)置參數(shù)
*/
void setting();
/**
* 打開 wifi
*/
void wifi();
}
新建小米手機產(chǎn)品類 cn.xs.abstraction.XiaomiPhone
代碼如下:
public class XiaomiPhone implements IPhoneProduct {
public void open() {
System.out.println("小米手機開機");
}
public void close() {
System.out.println("小米手機關(guān)機");
}
public void send() {
System.out.println("小米手機發(fā)短信");
}
public void call() {
System.out.println("小米手機打電話");
}
}
新建小米路由器產(chǎn)品類 cn.xs.abstraction.XiaomiRouter
?
代碼如下:
public class XiaomiRouter implements IRouterProduct {
public void open() {
System.out.println("小米路由器開機");
}
public void close() {
System.out.println("小米路由器關(guān)機");
}
public void setting() {
System.out.println("小米路由器設(shè)置參數(shù)");
}
public void wifi() {
System.out.println("小米路由器打開wifi");
}
}
新建華為手機產(chǎn)品類 cn.xs.abstraction.HuaweiPhone
代碼如下:
public class HuaweiPhone implements IPhoneProduct {
public void open() {
System.out.println("華為手機開機");
}
public void close() {
System.out.println("華為手機關(guān)機");
}
public void send() {
System.out.println("華為手機發(fā)短信");
}
public void call() {
System.out.println("華為手機打電話");
}
}
新建華為路由器產(chǎn)品類 cn.xs.abstraction.HuaweiRouter??
代碼如下:
public class HuaweiRouter implements IRouterProduct {
public void open() {
System.out.println("華為路由器開機");
}
public void close() {
System.out.println("華為路由器關(guān)機");
}
public void setting() {
System.out.println("華為路由器設(shè)置參數(shù)");
}
public void wifi() {
System.out.println("華為路由器打開wifi");
}
}
新建抽象工廠 cn.xs.abstraction.IProductFactory 來生產(chǎn)手機跟路由器(抽象):
public interface IProductFactory {
/**
* 生產(chǎn)手機
*
* @return
*/
IPhoneProduct getPhone();
/**
* 生產(chǎn)路由器
*
* @return
*/
IRouterProduct getRouter();
}
新建小米工廠 cn.xs.abstraction.XiaomiFactory 來生產(chǎn)手機跟路由器:
public class XiaomiFactory implements IProductFactory {
public IPhoneProduct getPhone() {
return new XiaomiPhone();
}
public IRouterProduct getRouter() {
return new XiaomiRouter();
}
}
新建華為工廠 cn.xs.abstraction.HuaweiFactory 來生產(chǎn)手機跟路由器:
?
public class HuaweiFactory implements IProductFactory {
public IPhoneProduct getPhone() {
return new HuaweiPhone();
}
public IRouterProduct getRouter() {
return new HuaweiRouter();
}
}
?根據(jù)類圖關(guān)系深入了解:
?
新建測試類 cn.xs.abstraction.Client 來進行測試:
public class Client {
/**
* 測試方法
*
* @param args
*/
public static void main(String[] args) {
System.out.println("==========小米系列產(chǎn)品==========");
// 創(chuàng)建小米工廠
IProductFactory factory1 = new XiaomiFactory();
IPhoneProduct phone1 = factory1.getPhone();
phone1.send();
phone1.call();
IRouterProduct router1 = factory1.getRouter();
router1.setting();
router1.wifi();
System.out.println("==========華為系列產(chǎn)品==========");
// 創(chuàng)建華為工廠
IProductFactory factory2 = new HuaweiFactory();
IPhoneProduct phone2 = factory2.getPhone();
phone2.send();
phone2.call();
IRouterProduct router2 = factory2.getRouter();
router2.setting();
router2.wifi();
}
}
再看一下整體的一個類圖
運行 main :?
抽象工廠模式在產(chǎn)品穩(wěn)定的情況下是極其強大的,但是如果要添加產(chǎn)品,其子類都需要修改代碼,違反了開閉原則
小結(jié):
簡單工廠模式(靜態(tài)工廠模式):
簡單工廠模式(靜態(tài)工廠模式):
雖然某種程度上不符合設(shè)計原則,但實際使用最多!
工廠方法模式:
不修改已有類的前提下,通過增加新的工廠類實現(xiàn)擴展
抽象工廠模式:
不可以增加產(chǎn)品,可以增加產(chǎn)品族!
應(yīng)用場景:
JDK中Calendar的getInstance方法
JDBC中的Connection對象的獲取
Spring中IOC容器創(chuàng)建管理bean對象反射中Class對象的newInstance方法
?