除了使用new操作符之外,還有更多指導(dǎo)對象的方法。你將了解到實例化這個活動不應(yīng)該總是公開地進行封孙,也會認(rèn)識到初始化經(jīng)常造成“耦合”問題。代碼綁著具體類會導(dǎo)致代碼更脆弱讽营,更缺乏彈性虎忌。
1.背景
現(xiàn)在有一支筆可以根據(jù)我們選擇"CIRCLE"、"RECTANGLE"橱鹏、"SQUARE"畫出不同的形狀膜蠢。
2.設(shè)計方案
我們將創(chuàng)建一個 Shape 接口和實現(xiàn) Shape 接口的實體類堪藐。下一步是定義工廠類 ShapeFactory。FactoryPatternDemo挑围,我們的演示類使用 ShapeFactory 來獲取 Shape 對象礁竞。它將向 ShapeFactory 傳遞信息(CIRCLE / RECTANGLE / SQUARE),以便獲取它所需對象的類型杉辙。
3.代碼展示
①創(chuàng)建Shape接口
public interface Shape {
void draw();
}
②創(chuàng)建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.");
}
}
③創(chuàng)建工廠
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;
}
}
④使用該工廠產(chǎn)生目標(biāo)對象
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.定義
工廠方法模式:定義了一個創(chuàng)建對象的接口蜘矢,但由子類決定要實例化的類是哪一個狂男。工廠方法讓類把實例化推遲到子類。
不要理解錯誤所謂的“決定”品腹,并不是指模式允許子類本身在運行時做決定岖食,而是指在編寫創(chuàng)建者類時,不需要知道實際創(chuàng)建的產(chǎn)品是哪一個珍昨。選擇了使用哪個子類县耽,自然就決定了實際創(chuàng)建的產(chǎn)品是什么。
5.依賴倒置原則
通過工廠模式镣典,代碼里減少對于具體類的依賴兔毙。這體現(xiàn)了一種設(shè)計原則“依賴倒置原則”:要依賴抽象,不要依賴具體類兄春。
這個原則說明了:不能讓高層組件依賴底層組件澎剥,而且,不管高層或底層組件赶舆,“兩者”都應(yīng)該依賴于抽象哑姚。