工廠模式(Factory Pattern)是 Java 中最常用的設計模式之一。這種類型的設計模式屬于創建型模式,它提供了一種創建對象的最佳方式。
在工廠模式中,我們在創建對象時不會對客戶端暴露創建邏輯,并且是通過使用一個共同的接口來指向新創建的對象。
優點: 1、一個調用者想創建一個對象,只要知道其名稱就可以了。 2、擴展性高,如果想增加一個產品,只要擴展一個工廠類就可以。 3、屏蔽產品的具體實現,調用者只關心產品的接口。
缺點:每次增加一個產品時,都需要增加一個具體類和對象實現工廠,使得系統中類的個數成倍增加,在一定程度上增加了系統的復雜度,同時也增加了系統具體類的依賴。這并不是什么好事。
實現步驟:
- 創建一個接口
/**
* 1. 創建一個接口
* @author mazaiting
*/
public interface Shape {
/**
* 畫圖方法
*/
void draw();
}
- 創建實現接口的實現類
/**
* 2. 創建實現接口的實現類--圓角矩形
* @author mazaiting
*/
public class Rectangle implements Shape{
public void draw() {
System.out.println("圓角矩形");
}
}
/**
* 2. 創建實現接口的實現類--矩形
* @author mazaiting
*/
public class Square implements Shape{
public void draw() {
System.out.println("矩形");
}
}
/**
* 2. 創建實現接口的實現類--圓形
* @author mazaiting
*/
public class Circle implements Shape{
public void draw() {
System.out.println("圓形");
}
}
- 創建一個工廠,生成基于給定信息的實體類對象
/**
* 3. 創建一個工廠,生成基于給定信息的實體類對象
* @author mazaiting
*/
public class ShapFactory {
/**圓角矩形類名稱(包名+類名)--com.mazaiting.shape.Rectangle*/
public static final String RECTANGLE = Rectangle.class.getName();
/**矩形類名稱(包名+類名)--com.mazaiting.shape.Square*/
public static final String SQUARE = Square.class.getName();
/**圓形類名稱(包名+類名)--com.mazaiting.shape.Circle*/
public static final String CIRCLE = Circle.class.getName();
/**
* 單例。如有不懂,請移步 單例模式(http://www.lxweimin.com/p/fb952d0140ec)
*/
private static ShapFactory sShapeFactory;
private ShapFactory(){}
public static ShapFactory getInstace() {
if (null == sShapeFactory) {
synchronized (ShapFactory.class) {
if (null == sShapeFactory) {
sShapeFactory = new ShapFactory();
}
}
}
return sShapeFactory;
}
/**
* 獲取形狀類型對象
* 使用反射創建具體類的實例。如有不懂,請移步 反射機制詳解(http://www.lxweimin.com/p/990910bd600e)
* @param type 類型
* @return 返回形狀類型對象
*/
public Shape getShape(String type) {
try {
Class<?> clazz = Class.forName(type);
return (Shape) clazz.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
- 主函數使用
public class Client {
public static void main(String[] args) {
// 獲取工廠類的實例
ShapFactory shapFactory = ShapFactory.getInstace();
// 獲得具體的圖形
Shape circle = shapFactory.getShape(ShapFactory.CIRCLE);
// 畫圖
circle.draw();
}
}