概述
- 定義:為建立一組相關或互相依賴的對象提供一個接口,而且無需指定它們的具體類。
- 抽象工廠模式又稱為Kit模式。工廠方法模式是用來建立一個産品的等級結構的,而抽象工廠模式是用來建立多個産品的等級結構;針對多個業務品種、業務分類
- 是一種對象建立型模式。
- 學習難度:★★★★☆
- 使用頻率:★★★★★
優缺點
- 優點
- 缺點
類圖

組成角色
- 抽象工廠類角色(AbstractFactory)
- 具體工廠類角色(ConcreteFactory)
- 抽象産品角色(AbstractProduct)
- 具體産品角色(ConcreteProduct)
Code Example
抽象工廠類角色(AbstractFactory)
/**
* 抽象工廠類。利用反射的機制擷取産品對象
*
* @author yanbin
*
*/
public abstract class AbstractCarFactory {
public abstract Car createCar();
public abstract Bus createBus();
/**
* 利用反射擷取抽象工廠
*
* @param className
* @return
*/
public static AbstractCarFactory getInstance(String className) {
AbstractCarFactory factory = null;
try {
factory = (AbstractCarFactory) Class.forName(className).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return factory;
}
}
具體工廠類角色(ConcreteFactory)
/**
* 具體工廠:Audo
*
* @author yanbin
*
*/
public class AudoFactory extends AbstractCarFactory {
@Override
public Bus createBus() {
return new AudoBus();
}
@Override
public Car createCar() {
return new AudoCar();
}
}
/**
* 具體工廠:産生Benz的産品
*
* @author yanbin
*
*/
public class BenzFactory extends AbstractCarFactory {
@Override
public Bus createBus() {
return new BenzBus();
}
@Override
public Car createCar() {
return new BenzCar();
}
}
/**
* 具體工廠:生産bmw
*
* @author yanbin
*
*/
public class BmwFactory extends AbstractCarFactory {
@Override
public Bus createBus() {
return new BmwBus();
}
@Override
public Car createCar() {
return new BmwCar();
}
}
抽象産品角色(AbstractProduct)
/**
* 抽象産品角色。定義統一的開車動作
*
* @author yanbin
*
*/
public interface Car {
public void driver();
}
/**
* 抽象産品角色。定義統一的開車動作
*
* @author yanbin
*
*/
public interface Bus {
public void driver();
}
具體産品角色(ConcreteProduct)
/**
* 具體産品:audo
*
* @author yanbin
*
*/
public class AudoBus implements Bus {
public void driver() {
System.out.println("audo bus drive");
}
}
/**
* 具體産品角色:Audo
*
* @author yanbin
*
*/
public class AudoCar implements Car {
public void driver() {
System.out.println("audo car drive");
}
}
/**
* 具體産品:benz
*
* @author yanbin
*
*/
public class BenzBus implements Bus {
public void driver() {
System.out.println("benz bus drive");
}
}
/**
* 具體産品角色:benz
*
* @author yanbin
*
*/
public class BenzCar implements Car {
public void driver() {
System.out.println("benz car drive");
}
}
/**
* 具體産品:bmw
*
* @author yanbin
*
*/
public class BmwBus implements Bus {
public void driver() {
System.out.println("bmw bus drive");
}
}
/**
* 具體産品角色:Bmw
*
* @author yanbin
*
*/
public class BmwCar implements Car {
public void driver() {
System.out.println("bmw car drive");
}
}
用戶端
/**
* 抽象工廠模式<br>
* 1、Java 的反射機制與配置檔案的巧妙結合突破了工廠代碼擴充的限制。<br>
* 2、組成:抽象工廠角色:核心、具體工廠角色、抽象産品角色、具體産品角色 <br>
* 3、抽象工廠就相當于,把不同的工廠再抽象起來一個公用的工廠。<br>
* 4、工廠方法模式是用來建立一個産品的等級結構的,而抽象工廠模式是用來建立多個産品的等級結構
*
* @author yanbin
* @version 2018/7/12 11:09
*
**/
public class AbstractFactory {
public static void main(String[] args) {
// 對象名,要在反射的時候輸入名稱,名稱需要在SRC檔案下的全路徑
AbstractCarFactory factory = AbstractCarFactory.getInstance("factory.abstraction.BmwFactory");
Car car = factory.createCar();
Bus bus = factory.createBus();
car.driver();
bus.driver();
}
}