假設您要製作一個對話方塊(Dialog)元件,您希望的是這個對話方塊可以有不同的視感(Look-and- feel),最基本的想法是,藉由Setter將不同視感的元件設定給這個對話方塊,例如:
見UML類別圖:
實現代碼
1
public interface IButton2

{3
void paintButton();4
}5
public interface ITextField6

{7
void paintITextField();8
}9
public interface IWidgetFactory10

{11
IButton getButton();12
ITextField getTextField();13
}14
public class WindowsButton:IButton15

{16

IButton 成員#region IButton 成員17

18
public void paintButton()19

{20
// TODO: 加入 WindowsButton.paintButton 實作21
System.Web.HttpContext.Current.Response.Write("Windows Button!");22
}23

24
#endregion25

26
}27
public class MacButton:IButton28

{29

IButton 成員#region IButton 成員30
public void paintButton()31

{32
System.Web.HttpContext.Current.Response.Write("Mac Button!");33
}34
35
#endregion36
}37
public class WindowsTextField:ITextField38

{39

ITextField 成員#region ITextField 成員40

41
public void paintITextField()42

{43
// TODO: 加入 WindowsTextField.paintITextField 實作44
45
System.Web.HttpContext.Current.Response.Write("Windows TextField!<br>");46
47
}48

49
#endregion50

51
}52
public class MacTextField:ITextField53

{54

ITextField 成員#region ITextField 成員55

56
public void paintITextField()57

{58
// TODO: 加入 MacTextField.paintITextField 實作59
System.Web.HttpContext.Current.Response.Write("Mac TextField!<br>");60
}61

62
#endregion63

64
}65
public class WindowsWidgetFactory:IWidgetFactory66

{67

IWidgetFactory 成員#region IWidgetFactory 成員68

69
public IButton getButton()70

{71
// TODO: 加入 WindowsWidgetFactory.getButton 實作72
return new WindowsButton();73
74
}75

76
public ITextField getTextField()77

{78
// TODO: 加入 WindowsWidgetFactory.getTextField 實作79
return new WindowsTextField();80
}81

82
#endregion83

84
}85
public class MacWidgetFactory:IWidgetFactory86

{87

IWidgetFactory 成員#region IWidgetFactory 成員88

89
public IButton getButton()90

{91
// TODO: 加入 MacWidgetFactory.getButton 實作92
return new MacButton();93
}94

95
public ITextField getTextField()96

{97
// TODO: 加入 MacWidgetFactory.getTextField 實作98
return new MacTextField();99
}100

101
#endregion102

103
}104
public class CustomDialog105

{106
private IButton Button;107
private ITextField TextField;108
public CustomDialog(IWidgetFactory widgetFactory)109

{110
setWidgetFactory(widgetFactory);111
}112
public void setWidgetFactory(IWidgetFactory widgetFactory)113

{114
setButton(widgetFactory.getButton());115
setTextField(widgetFactory.getTextField());116
}117
public void setButton(IButton button)118

{119
this.Button=button;120
}121
public void setTextField(ITextField textField)122

{123
this.TextField=textField;124
}125
public void showDialog()126

{127
this.paintDialog();128
this.Button.paintButton();129
this.TextField.paintITextField();130
}131
public void paintDialog()132

{133
System.Web.HttpContext.Current.Response.Write("CustomDialog Paints
<br>");134
}135
}Abstract Factory模式的UML結構圖:
簡單的說,在Abstract Factory模式中將具體的Product封裝在具體Factory實現中,而客戶仍只要面對Factory與Product的抽象介面,避免依賴於具體的Factory與Product,由於Factory封裝了所必須的Product,所以要更換掉所有的元件,只要簡單的抽換掉Factory就可以了,不用修改客戶端的程式。
浙公网安备 33010602011771号