除了使用new操作符之外,還有更多指導對象的方法。你將了解到實例化這個活動不應該總是公開地進行,也會認識到初始化經常造成“耦合”問題。代碼綁著具體類會導致代碼更脆弱,更缺乏彈性。
1.背景
現在有一支筆可以根據我們選擇"CIRCLE"、"RECTANGLE"、"SQUARE"畫出不同的形狀。
2.設計方案
我們將創建一個 Shape 接口和實現 Shape 接口的實體類。下一步是定義工廠類 ShapeFactory。FactoryPatternDemo,我們的演示類使用 ShapeFactory 來獲取 Shape 對象。它將向 ShapeFactory 傳遞信息(CIRCLE / RECTANGLE / SQUARE),以便獲取它所需對象的類型。
shape
3.代碼展示
①創建Shape接口
public interface Shape {
void draw();
}
②創建Cricle,Rectangle,Square實體類
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Inside Circle::draw() method.");
}
}
public class Square implements Shape {
@Override
public void draw() {
System.out.println("Inside Square::draw() method.");
}
}
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Inside Rectangle::draw() method.");
}
}
③創建工廠
public class ShapeFactory {
//使用 getShape 方法獲取形狀類型的對象
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;
}
}
④使用該工廠產生目標對象
public class FactoryPatternDemo {
public static void main(String[] args) {
ShapeFactory shapeFactory = new ShapeFactory();
Shape shape1 = shapeFactory.getShape("CIRCLE");
shape1.draw();
Shape shape2 = shapeFactory.getShape("RECTANGLE");
shape2.draw();
Shape shape3 = shapeFactory.getShape("SQUARE");
shape3.draw();
}
}
4.定義
工廠方法模式:定義了一個創建對象的接口,但由子類決定要實例化的類是哪一個。工廠方法讓類把實例化推遲到子類。
不要理解錯誤所謂的“決定”,并不是指模式允許子類本身在運行時做決定,而是指在編寫創建者類時,不需要知道實際創建的產品是哪一個。選擇了使用哪個子類,自然就決定了實際創建的產品是什么。
5.依賴倒置原則
通過工廠模式,代碼里減少對于具體類的依賴。這體現了一種設計原則“依賴倒置原則”:要依賴抽象,不要依賴具體類。
這個原則說明了:不能讓高層組件依賴底層組件,而且,不管高層或底層組件,“兩者”都應該依賴于抽象。