軟件系統(tǒng)
一個系統(tǒng)就像一個城市,該如何管理呢。
城市能運轉(zhuǎn),還因為它演化出來恰當?shù)某橄蟮燃壓湍K,好讓個人和他們所管理的“組件”在不了解全局時也能有效運轉(zhuǎn)。
整潔的代碼幫助我們在較低抽象層級上達到這一目標,本章將討論如何在較高的抽象層級——系統(tǒng)層級——上保持整潔。
將系統(tǒng)的構(gòu)造和使用分開
1.分解mian
- 將構(gòu)造與使用分開的方法之一是將全部的構(gòu)造過程搬遷到main模塊中,設(shè)計系統(tǒng)的其余部分時,假設(shè)所有對象(運行程序前所需的)都已正確構(gòu)造和設(shè)置。
- main函數(shù)創(chuàng)建系統(tǒng)所需的對象,再傳給application。這時候,應(yīng)用程序應(yīng)對對象的構(gòu)造過程一無所知
2.工廠
- 分解main的方法中,應(yīng)用程序并不知道對象何時被創(chuàng)建,但是有些情況下,應(yīng)用程序也要負責確定創(chuàng)建對象的時機,例如在某訂單處理系統(tǒng)中,應(yīng)用程序必須創(chuàng)建LineItem實體并添加到Order對象。
- 這種情況下,我們可以應(yīng)用抽象工廠模式讓應(yīng)用程序自行控制何時創(chuàng)建LineItem,同時構(gòu)造的細節(jié)隔離于應(yīng)用程序代碼之外。如圖所示,從箭頭的方向可知,應(yīng)用程序OrderProcessing與如何構(gòu)建LineItem的細節(jié)是分離開的,它只擁有抽象工廠方法的接口,具體細節(jié)是由main這邊的LineItemFactoryImplementation實現(xiàn)的。但應(yīng)用程序能完全控制LineItem實體何時創(chuàng)建,甚至能傳遞應(yīng)用特定的構(gòu)造器參數(shù)。
0_1328414707Rk6k.gif.png
代碼示例
@author ASCE1885
public class Main {
public static void main(String[] args) {
LineItemFactory lif = new LineItemFactoryImpl();
OrderProcessing op = new OrderProcessing(lif);
op.run();
}
}
public class LineItemFactoryImpl implements LineItemFactory {
private LineItem lineItem;
@Override
public LineItem makeLineItem(String name) {
if (null == lineItem) {
lineItem = new LineItem(name);
}
return lineItem;
}
}
public class OrderProcessing {
private LineItem lineItem;
private LineItemFactory lineItemFactory;
public OrderProcessing(LineItemFactory lif) {
lineItemFactory = lif;
}
public void run() {
lineItem = lineItemFactory.makeLineItem("ASCE1885");
System.out.println("The name of lineItem is : " + lineItem.getName());
}
}
public interface LineItemFactory {
public LineItem makeLineItem(String name);
}
public class LineItem {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public LineItem(String name) {
this.name = name;
}
}