工廠模式
介紹
定義一個創建對象的接口,讓其子類自己決定實例化哪一個工廠類,工廠模式使其創建過程延遲到子類進行。(創建型模式)
使用場景
例如orm框架,在選擇數據庫的時候只需要替換方言和驅動,不需要對已經實現的具體細節進行改動。
- 優點:使用工廠模式可以屏蔽具體實現,只需要關心接口的調用;在增加一個產品的時候,只需要在工廠類裏擴展一個產品就可以。
- 缺點:每增加產品就必須增加具體實現類和實現工廠,增加了系統複雜性。(如果產品非常非常多,233333)
DEMO
工廠模式比較簡單,就寫個最常用的例子:圖形。
package factory.pattern;
/**
* Created by FK on 2017/6/17.
*/
public interface Shape {
void draw();
}
創建 shape抽象類
package factory.pattern;
/**
* Created by FK on 2017/6/17.
*/
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Rectangle : draw()");
}
}
rectangle實現shape方法
package factory.pattern;
/**
* Created by FK on 2017/6/17.
*/
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Circle : draw()");
}
}
circle實現shape方法
package factory.pattern;
/**
* Created by FK on 2017/6/17.
*/
public class Square implements Shape {
@Override
public void draw() {
System.out.println("Square : draw()");
}
}
square實現shape方法
package factory.pattern;
/**
* Created by FK on 2017/6/17.
*/
public class ShapeFactory {
public Shape getShape(String shapeType){
if(shapeType == null){
return null;
}
if(shapeType.equalsIgnoreCase("CIRCLE")){
return new Circle();
} else if(shapeType.equalsIgnoreCase("RECTANGLE")){
return new Rectangle();
} else if(shapeType.equalsIgnoreCase("SQUARE")){
return new Square();
}
return null;
}
}
創建一個工廠,生成基於給傳入值的實體類的對象。
package factory.pattern;
/**
* Created by FK on 2017/6/17.
*/
public class FactoryPattern {
public static void main(String[] args) {
ShapeFactory shapeFactory = new ShapeFactory();
Shape circle = shapeFactory.getShape("CIRCLE");
//調用 Circle 的 draw 方法
circle.draw();
Shape rectangle = shapeFactory.getShape("RECTANGLE");
//調用 Rectangle 的 draw 方法
rectangle.draw();
Shape square = shapeFactory.getShape("SQUARE");
//調用 Square 的 draw 方法
square.draw();
}
}
寫個demo來測試下輸出是否實現了工廠模式,輸出如下:
Circle : draw()
Rectangle : draw()
Square : draw()
博客來自
fk5431
http://fk5431.com/20170617/Design_pattern/factory_pattern/
希望去新博客踩踩!
代碼都在github上,地址是fk5431
https://github.com/fk5431/designPatterns