抽象工廠(Abstract Factory)提供了一種方式曹仗,可以將一組具有相同主題的單獨工廠分裝起來老速,使用中只需要創(chuàng)建抽象工廠的具體實現(xiàn),然后使用抽象工廠作為接口來創(chuàng)建這一主題的具體對象。
示例
- 定義一個抽象工廠類提供包括多種產(chǎn)品的攝影服務(wù)孵构,如拍攝證件照
CertificatePhoto
、拍攝婚紗照WeddingPhoto
烟很。
public interface AbstractFactory {
CertificatePhoto certificatePhoto();
WeddingPhoto weddingPhoto();
}
public interface CertificatePhoto {
// 方法略
}
public interface WeddingPhoto {
// 方法略
}
- 有兩家影棚颈墅,其中一家提供出國證件照和歐式婚紗照攝影服務(wù)。
public class Factory1 implements AbstractFactory {
@Override
public CertificatePhoto certificatePhoto() {
return new VisaCertificatePhoto();
}
@Override
public WeddingPhoto weddingPhoto() {
return new EuropeanWeddingPhoto();
}
}
public class VisaCertificatePhoto implements CertificatePhoto {
// 方法略
}
public class EuropeanWeddingPhoto implements WeddingPhoto {
// 方法略
}
- 另一家影棚提供學(xué)位證件照和中式婚紗照攝影服務(wù)雾袱。
public class Factory2 implements AbstractFactory {
@Override
public CertificatePhoto certificatePhoto() {
return new DegreeCertificatePhoto();
}
@Override
public WeddingPhoto weddingPhoto() {
return new ChineseWeddingPhoto();
}
}
public class DegreeCertificatePhoto implements CertificatePhoto {
// 方法略
}
public class ChineseWeddingPhoto implements WeddingPhoto {
// 方法略
}
- 使用第一個影棚提供的產(chǎn)品服務(wù)恤筛。
public static void main(String[] args) {
AbstractFactory factory = new Factory1();
CertificatePhoto certificatePhoto = factory.certificatePhoto();
// 調(diào)用 certificatePhoto 具體實現(xiàn)方法
WeddingPhoto weddingPhoto = factory.weddingPhoto();
// 調(diào)用 weddingPhoto 具體實現(xiàn)方法
}
如果想使用第二個影棚提供的產(chǎn)品服務(wù)只需要將new Factory1()
修改成new Factory2()
。
以上代碼只引用了產(chǎn)品接口CertificatePhoto
和WeddingPhoto
芹橡,未引用任何實際的產(chǎn)品實現(xiàn)毒坛。如果將創(chuàng)建工廠實例的代碼放到AbstractFactory
中,則連實際的工廠都屏蔽了林说。
public interface AbstractFactory {
CertificatePhoto certificatePhoto();
WeddingPhoto weddingPhoto();
public static AbstractFactory createFactory(String name) {
if (name.equalsIgnoreCase("factory1")) {
return new Factory1();
}
if (name.equalsIgnoreCase("factory2")) {
return new Factory2();
}
throw new IllegalArgumentException("Illegal factory name.");
}
}