工廠方法模式(Factory Method Pattern)定義一個創建產品對象的工廠接口,將產品對象的實際創建工作推遲到具體子工廠類當中。這滿足創建型模式中所要求的“創建與使用相分離”的特點。
優點:
- 用戶只需要知道具體工廠的名稱就可得到所要的產品,無須知道產品的具體創建過程;
- 在系統增加新的產品時只需要添加具體產品類和對應的具體工廠類,無須對原工廠進行任何修改,滿足開閉原則;
缺點:
- 每增加一個產品,就要新增一個對應的工廠類和產品類,增加系統的複雜度
角色:
- 抽象工廠(Abstract Factory):提供了創建產品的接口,調用者通過它訪問具體工廠的工廠方法 newProduct() 來創建產品。
- 具體工廠(ConcreteFactory):主要是實現抽象工廠中的抽象方法,完成具體產品的創建。
- 抽象產品(Product):定義了產品的規範,描述了產品的主要特性和功能。
- 具體產品(ConcreteProduct):實現了抽象產品角色所定義的接口,由具體工廠來創建,它同具體工廠之間一一對應。
結構圖:
類圖:
代碼實現:
//抽象工廠
public interface Factory {
Product getProduct();
}
//生產A產品的工廠
public class FactoryA implements Factory {
@Override
public Product getProduct() {
return new ProductA();
}
}
//生產B產品的工廠
public class FactoryB implements Factory {
@Override
public Product getProduct() {
return new ProductB();
}
}
//抽象產品
public interface Product {
String getInfo();
}
//A 產品
public class ProductA implements Product {
public String getInfo() {
return "我是產品A";
}
}
//B 產品
public class ProductB implements Product {
public String getInfo() {
return "我是產品B";
}
}
//客戶端
public class Test {
public static void main(String[] args) {
Factory factoryA = new FactoryA();
Product productA = factoryA.getProduct();
System.out.println(productA.getInfo());
System.out.println("------------------------------------------");
Factory factoryB= new FactoryB();
Product productB = factoryB.getProduct();
System.out.println(productB.getInfo());
}
}