Simple Factory Pattern:
提供產生物件的方法, 而無須關注實作內容, 其物件類型可為interface, abstract class, class
當類別內有多建構式存在且每個建構式無法清楚的說明其用途時, 可使用Simple Factory代替建構式, 在SimpleFactory中以清楚的方法名稱說明建構式的用途
這是我在專案遇到的情況, 我必須寫出1個Dialog, 此Dialog的元件在不同的情況下會有不同的組合, 如在A情況此dialog只有1個按鈕, 在B情況會有2個按鈕
一開始考慮使用建構式來決定產生何種dialog
package com.foxx.simplefactory; import android.app.Dialog; import android.content.Context; import android.widget.Button; import android.widget.TextView; public class CustomDialog extends Dialog { private String mDescription; private TextView mUpTextView; private TextView mDownTextView; private Button mUpButton; private Button mDownButton; /** * Used in one button */ public CustomDialog(Context context, Button upButton) { super(context); } /** * Used in two button */ public CustomDialog(Context context, Button upButton, Button downButton) { super(context); } /** * Used in one button and one description */ public CustomDialog(Context context, Button upButton, String description) { super(context); } }
CustomDialog的使用者除了從建構式的參數以及註解外, 無法了解建構式的使用方式(意圖), 為了解決這個情況我試著引入Simple Factory來修改
package com.foxx.simplefactory; import android.content.Context; import android.widget.Button; public class CustomDialogFactory { public static CustomDialog createOneButtonDialog(Context context, Button upButton) { return new CustomDialog(context, upButton); } public static CustomDialog createTwoButtonDialog(Context context, Button upButton, Button downButton) { return new CustomDialog(context, upButton, downButton); } public static CustomDialog createOneButtonOneDescriptionDialog(Context context, Button upButton, String description) { return new CustomDialog(context, upButton, description); } }
使用者可根據Simple Factory的方法名稱選擇建立CustomDialog物件
package com.foxx.simplefactory; import com.example.simplefactory.R; import com.foxx.factorymethod.*; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); CustomDialog oneButtonDialog = CustomDialogFactory.createOneButtonDialog(context, upButton); CustomDialog twoButtonDialog = CustomDialogFactory.createTwoButtonDialog(context, upButton, downButton); CustomDialog oneButtonOneDescriptionDialog = CustomDialogFactory.createOneButtonOneDescriptionDialog(context, upButton, description); } }