抽象工廠模式:提供一個建立一系列相關或相互依賴對象的接口,而無需指定它們具體的類。ide
咱們先回憶一下簡單工廠模式的情形,有一個建立產品的接口,須要建立不一樣的產品時咱們就須要建立多個工廠類。spa
//工廠接口 public interface IFactory { //建立產品 Product createProduct(); } //具體工廠 public class CarFactory implements IFactory { @Override public Product createProduct() { //建立產品實例對象 return new Car(); } } public class BicycleFactory implements IFactory { @Override public Product createProduct() { return new Bicycle(); } }
public class Customer { public static void main(String[] args) { IFactory carFactory = new CarFactory(); Product car = carFactory.createProduct(); car.run(); IFactory bicycleFactory = new BicycleFactory(); Product bicycle = bicycleFactory.createProduct(); bicycle.run(); } }
可是若是是這麼一種情形呢,咱們要生產的產品是一個類別,而且再也不是一個,而是多個時,這種product接口就不符合狀況了code
咱們看一個例子,假設須要不一樣的方法建立一系列產品對象
產品接口A以及實現。blog
public interface ProductA { void Show(); } public class ProductA1 implements ProductA { @Override public void Show() { System.out.println("使用工廠1生產出了產品A"); } } public class ProductA2 implements ProductA { @Override public void Show() { System.out.println("使用工廠2生產出了產品A"); } }
產品接口B以及實現。接口
public interface ProductB { void Show(); } public class ProductB1 implements ProductB { @Override public void Show() { System.out.println("使用工廠1生產出了產品B"); } } public class ProductB2 implements ProductB { @Override public void Show() { System.out.println("使用工廠2生產出了產品B"); } }
工廠接口以及實現,兩個具體工廠分別對應兩種生產該產品的方法。產品
public interface Factory { ProductA ManufactureA(); ProductB ManufactureB(); } public class ConcreateFactory1 implements Factory { @Override public ProductA ManufactureA() { return new ProductA1(); } @Override public ProductB ManufactureB() { return new ProductB1(); } } public class ConcreateFactory2 implements Factory { @Override public ProductA ManufactureA() { return new ProductA2(); } @Override public ProductB ManufactureB() { return new ProductB2(); } }
在實際應用中,咱們可能只須要某一種方法去建立產品A,B,可是當咱們想要切換產品的生產方法時,就只須要將new ConcreateFactory1()替換爲new ConcreateFactory2()就能夠了,此時不管是哪個工廠的方法,他生產某一個產品調用的都是同一個方法,例如factory.ManufactureA();可是若是在工廠方法模式中,咱們新增一個產品的製做方法,就須要新增工廠,在客戶端內去調用不一樣工廠的createProduct()這樣就增長了系統的複雜性。class
public class Test { public static void main(String[] args){ Factory factory = new ConcreateFactory1(); ProductA productA = factory.ManufactureA(); ProductB productB = factory.ManufactureB(); productA.Show(); productB.Show(); Factory factory2 = new ConcreateFactory2(); ProductA productA2 = factory2.ManufactureA(); ProductB productB2 = factory2.ManufactureB(); productA2.Show(); productB2.Show(); } }