抽象工廠模式
抽象工廠模式(Abstract Factory Pattern)是圍繞一個超級工廠創建其他工廠。該超級工廠又稱爲其他工廠的工廠。這種類型的設計模式屬於創建型模式,它提供了一種創建對象的最佳方式。
在抽象工廠模式中,接口是負責創建一個相關對象的工廠,不需要顯式指定它們的類。每個生成的工廠都能按照工廠模式提供對象。
介紹
意圖:提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們具體的類。
主要解決:主要解決接口選擇的問題。
何時使用:系統的產品有多於一個的產品族,而系統只消費其中某一族的產品。
如何解決:在一個產品族裏面,定義多個產品。
關鍵代碼:在一個工廠裏聚合多個同類產品。
應用實例:工作了,爲了參加一些聚會,肯定有兩套或多套衣服吧,比如說有商務裝(成套,一系列具體產品)、時尚裝(成套,一系列具體產品),甚至對於一個家庭來說,可能有商務女裝、商務男裝、時尚女裝、時尚男裝,這些也都是成套的,即一系列具體產品。假設一種情況(現實中是不存在的,要不然,沒法進入共產主義了,但有利於說明抽象工廠模式),在您的家中,某一個衣櫃(具體工廠)只能存放某一種這樣的衣服(成套,一系列具體產品),每次拿這種成套的衣服時也自然要從這個衣櫃中取出了。用 OOP 的思想去理解,所有的衣櫃(具體工廠)都是衣櫃類的(抽象工廠)某一個,而每一件成套的衣服又包括具體的上衣(某一具體產品),褲子(某一具體產品),這些具體的上衣其實也都是上衣(抽象產品),具體的褲子也都是褲子(另一個抽象產品)。
優點:當一個產品族中的多個對象被設計成一起工作時,它能保證客戶端始終只使用同一個產品族中的對象。
缺點:產品族擴展非常困難,要增加一個系列的某一產品,既要在抽象的 Creator 里加代碼,又要在具體的裏面加代碼。
使用場景: 1、QQ 換皮膚,一整套一起換。 2、生成不同操作系統的程序。
注意事項:產品族難擴展,產品等級易擴展。
實現:
創建產品電飯煲RiceCooker接口:
/**
* 電飯煲 接口
*/
public interface RiceCooker {
void on();//開
void off();//關
void cook();//煮
void heat();//加熱
}
創建產品攪拌機Blender接口:
/**
* 攪拌機 接口
*/
public interface Blender {
void on();//開
void off();//關
void stir();//攪拌
}
創建具體的電飯煲類:
/**
* 蘇泊爾電飯煲
*/
public class SuporRiceCooker implements RiceCooker {
public void on() {
System.out.println("蘇泊爾電飯煲開啓");
}
public void off() {
System.out.println("蘇泊爾電飯煲關閉");
}
public void cook() {
System.out.println("蘇泊爾電飯煲煮粥");
}
public void heat() {
System.out.println("蘇泊爾電飯煲加熱");
}
}
/**
* 美的 電飯煲
*/
public class MideaRiceCooker implements RiceCooker {
public void on() {
System.out.println("美的電飯煲開啓");
}
public void off() {
System.out.println("美的電飯煲關閉");
}
public void cook() {
System.out.println("美的電飯煲煮粥");
}
public void heat() {
System.out.println("美的電飯煲加熱");
}
}
創建具體的攪拌機類:
/**
* 蘇泊爾攪拌機
*/
public class SuporBlender implements Blender {
public void on() {
System.out.println("蘇泊爾攪拌機開啓");
}
public void off() {
System.out.println("蘇泊爾攪拌機關閉");
}
public void stir() {
System.out.println("蘇泊爾攪拌機攪拌");
}
}
/**
* 美的 攪拌機
*/
public class MideaBlender implements Blender {
public void on() {
System.out.println("美的攪拌機開啓");
}
public void off() {
System.out.println("美的攪拌機關閉");
}
public void stir() {
System.out.println("美的攪拌機攪拌");
}
}
創建產品工廠接口:
/**
* 產品工廠 接口
*/
public interface ProductFactory {
// 電飯煲
RiceCooker riceCooker();
// 攪拌機
Blender blender();
}
創建具體的產品工廠類:
/**
* 蘇泊爾工廠
*/
public class SuporFactory implements ProductFactory {
public RiceCooker riceCooker() {
return new SuporRiceCooker();
}
public Blender blender() {
return new SuporBlender();
}
}
/**
* 美的 工廠
*/
public class MideaFactory implements ProductFactory {
public RiceCooker riceCooker() {
return new MideaRiceCooker();
}
public Blender blender() {
return new MideaBlender();
}
}
創建測試類AbstractMain:
public class AbstractMain {
public static void main(String[] args) {
System.out.println("<<<<<<<<<<<<<<蘇泊爾產品>>>>>>>>>>>>>>>>");
SuporFactory suporFactory = new SuporFactory();
RiceCooker riceCooker = suporFactory.riceCooker();
riceCooker.on();
riceCooker.cook();
riceCooker.heat();
riceCooker.off();
Blender blender = suporFactory.blender();
blender.on();
blender.stir();
blender.off();
System.out.println("<<<<<<<<<<<<<<美的產品>>>>>>>>>>>>>>>>");
MideaFactory mideaFactory = new MideaFactory();
RiceCooker riceCooker1 = mideaFactory.riceCooker();
riceCooker1.on();
riceCooker1.cook();
riceCooker1.heat();
riceCooker1.off();
Blender blender1 = mideaFactory.blender();
blender1.on();
blender1.stir();
blender1.off();
}
}
運行結果: