提供一個接口用於創建相關或依賴對象的家族,而不需要明確指定具體類。
類型:
創建型模式
適用場景:
產品族
優點:
將一系列的產品族一起創建
缺點
規定了所有可能被創建的產品集合,產品族中擴展新的產品困難,需要修改抽象工廠的接口,同時增加系統抽象與理解難度。
抽象工廠與工廠方法的不同在於,抽象工廠關心產品族,工廠方法關心產品等級。
代碼實現
改進工廠方法模式
《設計模式》之工廠方法模式
在上一次的工廠方法中已經創建了手機產品的huawei工廠與iphone工廠。
我們只需要增加產品族即可
引入《設計模式》之工廠方法模式 中的Phone接口與具體實現
Phone.java 為所有生產手機的類提供了一種約束
<code>public class HuaweiPhone implements Phone {
@Override public void produce() {
System.out.println("生產華為手機");
}
}/<code>
HuaweiPhone.java 華為生產手機的具體實現
<code>public class HuaweiPhone implements Phone {
@Override public void produce() {
System.out.println("生產華為手機");
}
}/<code>
Iphone.java 蘋果生產產品的具體實現
<code>public class Iphone implements Phone {
@Override public void produce() {
System.out.println("produce iphone");
}
}/<code>
華為與蘋果不止生產手機,還生產智能手錶與藍牙耳機(抽象工廠的產品族指的就是本文中華為或蘋果這個品牌)。
創建智能手錶的相關實現
watch.java 接口,對所有智能手錶產品進行約束
<code>public interface Watch {
void produce()
;}/<code>
HuaweiWatch.java 華為手錶具體實現
<code>public class HuaweiWatch implements Watch{
@Override
public void produce() {
System.out.println("produce huawei watch");
}
}/<code>
AppleWatch.java 蘋果手錶具體實現
<code>public class AppleWatch implements Watch{
@Override
\t\t\tpublic void produce() {
\t\tSystem.out.println("produce apple watch");
}
}/<code>
創建生產產品的工廠
SmartDevice.java 對所有工廠進行約束
<code>public interface SmartDevice {
public Phone makePhone();
public Watch makeWatch();
}/<code>
HuaweiFactory.java 華為工廠
<code>public class HuaweiFactory implements SmartDevice{
@Override public Phone makePhone() {
return new HuaweiPhone(); }
@Override public Watch makeWatch() {
return new HuaweiWatch(); }
}/<code>
AppleFactory.java蘋果工廠
<code>public class AppleFactory implements SmartDevice{
@Override public Phone makePhone() {
return new Iphone(); }
@Override public Watch makeWatch() {
return new AppleWatch(); }
}/<code>
Client.java 客戶端調用
<code>public class Client {
public static void main(String[] args) {
SmartDevice smartDevice=new AppleFactory();
\tsmartDevice.makePhone().produce();
\tsmartDevice.makeWatch().produce();
}
}/<code>
UML類圖
本文代碼託管在GitHub
https://github.com/tanchengjin/designPattern
閱讀更多 狂熱知識分子 的文章