工廠模式
這種類型的設計模式屬於創建型模式,它提供了一種創建對象的最佳方式。在工廠模式中,我們在創建對象時不會對客戶端暴露創建邏輯,並且是通過使用一個共同的接口來指向新創建的對象。
介紹
應用實例: 1、你需要一輛汽車,可以直接從工廠裏面提貨,而不用去管這輛汽車是怎麼做出來的,以及這個汽車裏面的具體實現。
使用場景: 1、日誌記錄器:記錄可能記錄到本地硬盤、系統事件、遠程服務器等,用戶可以選擇記錄日誌到什麼地方。
實現
首先創建一個 Shape 接口和實現 Shape 接口的三個實體類,然後創建工廠類ShapeFactory。在演示類FactoryPatternDemo中使用 ShapeFactory 來獲取 Shape 對象。向 ShapeFactory 傳遞信息(circle / rectangle/ square),來獲取所需對象的類型。
步驟1
創建一個接口。
Shape.java
package factorypattern;
public interface Shape {
void draw();
}
步驟2
創建實現接口的實體類。
Rectangle.java
package factorypattern;
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Inside Rectangle::draw() method.");
}
}
Square.java
package factorypattern;
public class Square implements Shape {
@Override
public void draw() {
System.out.println("Inside Square::draw() method.");
}
}
Circle.java
package factorypattern;
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Inside Circle::draw() method.");
}
}
步驟3
創建一個工廠,生成基於給定信息的實體類的對象。
ShapeFactory.java
package factorypattern;
public class ShapeFactory {
/**
* 使用getShape方法來獲取形狀類型的對象
* @param shapeType
* @return
*/
public Shape getShape(String shapeType){
if (shapeType == null){
return null;
}else if (shapeType.equalsIgnoreCase("RECTANGLE")){
return new Rectangle();
}else if (shapeType.equalsIgnoreCase("SQUARE")){
return new Square();
}else if (shapeType.equalsIgnoreCase("CIRCLE")){
return new Circle();
}
return null;
}
}
步驟4
使用該工廠,通過傳遞類型信息來獲取實體類的對象。
ShapeFactoryDemo.java
package factorypattern;
public class ShapeFactoryDemo {
public static void main(String[] args) {
ShapeFactory shapeFactory = new ShapeFactory();
Shape shape1 = shapeFactory.getShape("rectangle");
shape1.draw();
Shape shape2 = shapeFactory.getShape("square");
shape2.draw();
Shape shape3 = shapeFactory.getShape("circle");
shape3.draw();
}
}
步驟5
執行程序,輸出結果:
Inside Rectangle::draw() method.
Inside Square::draw() method.
Inside Circle::draw() method.