工廠模式是軟件設(shè)計中最常用也最常見的一種模式,這里通過一個例子來說明其功能。
問題背景
用戶需求:請?zhí)峁?1)、圖形繪制功能,當前可繪制當前可繪制原型、方形、三角形。未來可能需要支持繪制菱形、梯形等形狀。2)、圖形可以提供一些其他的方法,比如繪制、染色、描邊等
系統(tǒng)設(shè)計
依據(jù)上面的需求,我們很自然的會想到以下設(shè)計點:
- 定義接口類,該類定義了對用戶提供的方法,比如繪制、染色、描邊等。
- 接口實現(xiàn)類,依據(jù)不同的圖形來實現(xiàn)接口。
上面兩點設(shè)計,完全可以實現(xiàn)用戶需求。 但它有一個劣勢:用戶需要記住每個圖形的實現(xiàn)類。隨著增加新圖形,或者更改當前使用的圖形時,用戶都需要不斷實例化新的類。
此時,我們可以通過工廠模式來降低用戶使用接口的復(fù)雜度。 即,我們提供一個工廠類,用戶只需要輸入圖形類型即可獲取到該圖形的實例。用戶不再需要記憶每個圖形對應(yīng)的類名。
所以,工廠模式是為了降低用戶使用接口復(fù)雜度而出現(xiàn)的一個鐘設(shè)計模式。
編碼實現(xiàn)
public interface IShape {
void draw();
}
- 其次,實現(xiàn)一個工廠,該工廠提供圖形實例給用戶
public class ShapeFactory {
public IShape create(String id)
{
if (id == null)
{
throw new IllegalArgumentException("id is null");
}
if ("Circle".equals(id))
{
return new Circle();
}
if ("Rectangle".equals(id))
{
return new Rectangle();
}
if ("Triangle".equals(id))
{
return new Triangle();
}
throw new IllegalArgumentException("Unknow id = "+id);
}
}
- 最后,實現(xiàn)工廠實體內(nèi)容,即實現(xiàn)圖形類。這里用圓形類舉例,其它類不一一例句。
public class Circle implements IShape {
@Override
public void draw() {
System.out.println("draw a Circle");
}
}
如上,清晰明了的說明了工廠模式的作用,及實現(xiàn)方法。
如果對例子感興趣,可以私信我。