第11章 Abstract Factory模式

2021-04-15 09:27:29 字數 2599 閱讀 6165

abstract factory模式:抽象工廠模式,為建立一組相關或相互依賴的物件提供乙個介面,而且無需指定它們的具體類。

abstract factory模式:關鍵特徵

意圖:需要為特定的客戶提供物件組。

解決方案:協調物件組的建立。提供一種方式,將如何執行物件例項化的規則從使用這些物件的客戶物件提取出來。

效果:這個模式將「使用哪些物件」的規則與「如何使用這些物件」的邏輯分離開來。

實現:定義乙個抽象類來指定建立哪些物件。然後為每個組實現乙個具體類。可以用表或檔案完成同樣的任務。 

假設您要製作乙個對話方塊(dialog)元件,您希望的是這個對話方塊可以有不同的視感(look-and- feel),最基本的想法是,藉由setter將不同視感的元件設定給這個對話方塊,例如:

public class customdialog 

public void settextfield(itextfield textfield)

public void layoutallcomponents()

public void showdialog()

public void paintdialog()

}

很簡單,這是最基本的介面依賴,setter依賴於ibutton與itextfield兩個介面,而不是其實作類別,不過這邊還有個進一步的要求,使用上面的方式還必須親自呼叫setter、layout等方法,您希望視感的更換可以更簡單些,例如只要透乙個元件的替換就可以完成對話方塊上所有元件的視感更換。

您可以使用abstract factory模式,將所有對話方塊所需要的產生的元件加以封裝,對話方塊依賴於abstract factory,實際上具體的factory實現則分別產生對話方塊所需要的視感元件,下面的 uml 類別圖展現這種概念。

現在如果要更換所有的視感元件,就只要抽象掉具體的factory就可以了,例如:

customdialog windowsdialog =

new customdialog(new windowswidgetfactory());

windowsdialog.showdialog();

customdialog macdialog =

new customdialog(new macwidgetfactory());

macdialog.showdialog();

來將上面的uml圖具體實現出來。

public class customdialog 

// 由於客戶端只依賴於抽象的工廠,工廠如何實作並無關客戶端的事

// 要抽換工廠並不需要改動客戶端的程式

public void setwidgetfactory(iwidgetfactory widgetfactory)

public void layoutallcomponents()

// 這邊也是依賴抽象,實際改變了元件例項

// 客戶端**也不用更改

public void setbutton(ibutton button)

public void settextfield(itextfield textfield)

public void showdialog()

public void paintdialog()

}

public inte***ce ibutton  

public inte***ce itextfield  

public inte***ce iwidgetfactory  

public class macbutton implements ibutton 

}

public class windowsbutton implements ibutton 

}

public class mactextfield implements itextfield 

}

public class windowstextfield implements itextfield 

}

public class macwidgetfactory implements iwidgetfactory 

public itextfield gettextfield()

}

public class windowswidgetfactory 

implements iwidgetfactory

public itextfield gettextfield()

}

下圖是abstract factory模式的uml結構圖:

簡單的說,在abstract factory模式中將具體的product封裝在具體factory實現中,而客戶仍只要面對factory與product的抽象介面,避免依賴於具體的factory與product,由於factory封裝了所必須的product,所以要更換掉所有的元件,只要簡單的抽換掉factory就可以了,不用修改客戶端的程式。

第11章 執行緒

執行緒標識 就像每個程序有乙個程序id一樣,每個執行緒也有乙個執行緒id。程序id在整個系統中是唯一的,但執行緒id不同,執行緒id只有在它所屬的程序上下文中才有意義。程序id 用pid t資料型別表示 執行緒id用pthread t資料型別來表示 includeint pthread equal ...

第11章 執行緒

1.執行緒的作用 1 對於程式設計而言 當我們的乙個程序在某一時刻,需要做的事件不止一件的時候,一般有兩種方法。一種是採用非同步程式設計的模式,一種是採用多執行緒同步模式。但是多執行緒同步模式遠遠比非同步模式要方便的多。但是對於單核系統,往往非同步程式設計模式效率更高。2 對於互動程式,一般都是要多...

第11章 函式

1 把相關的語句組合在一起,並且賦予相應的名稱,用這種方法來給程式分塊,這種形式的組合就是函式,函式也叫例程或者過程。程式總是從 main 函式開始啟動。函式由函式名 引數 返回值型別以及一組包含操作語句的語句塊組成。函式可以支援過載,程式就是由函式組成。2 形參是函式定義時在形參表中定義的,並且由...