工廠方法模式:定義一個建立對象的接口,但讓實現這個接口的類來決定實例化哪一個類,也就是說工廠方法模式讓實例化推遲到子類ide
應用場景:code
- 客戶只知道建立產品的工廠名,而不知道具體的產品名
- 建立對象的任務由多個具體子工廠中的某一個完成,而抽象工廠只提供建立產品的接口。
- 客戶不關心建立產品的細節,只關心產品的品牌
工廠方法模式的組件:對象
- Factory(抽象工廠):提供了建立產品的接口,調用者經過它訪問具體工廠的工廠方法來建立產品。
- ConcreteFactory(具體工廠):主要是實現抽象工廠中的抽象方法,完成具體產品的建立
- Product(抽象產品):定義了產品的規範,描述了產品的主要特性和功能
- ConcreteProduct(具體產品):實現了抽象產品角色所定義的接口,由具體工廠來建立,它同具體工廠之間一一對應
工廠方法模式組件示例:
抽象產品:接口
public interface Shape { void shapeDesc(); }
具體產品:產品
public class Circle implements Shape { @Override public void shapeDesc() { System.out.println("這是一個圓形"); } }
public class Rectangle implements Shape { @Override public void shapeDesc() { System.out.println("這是一個矩形"); } }
public class Square implements Shape { @Override public void shapeDesc() { System.out.println("這是一個正方形"); } }
抽象工廠:class
public interface Factory { Shape createShape(); }
具體工廠:方法
public class CircleFactory implements Factory { @Override public Shape createShape() { return new Circle(); } }
public class RectangleFactory implements Factory { @Override public Shape createShape() { return new Rectangle(); } }
public class SquareFactory implements Factory { @Override public Shape createShape() { return new Square(); } }
工廠方法模式總結:im
- 新增一種產品時,只須要增長相應的具體產品類和相應的工廠子類便可,更符合開-閉原則
- 每一個具體工廠類只負責建立對應的產品,更符合單一職責原則
- 若產品過多時,會致使系統類的個數將成對增長,在必定程度上增長了系統的複雜度