標籤:android 原廠模式
Factory 方法模式(Factory Method)
Factory 方法模式是類的建立模式,又叫做多態性原廠模式。這個模式的用意在於定義一個建立產品對象的工廠介面,並將實際的建立工作延遲到工廠子類中去完成。
原廠模式支援繼承機制,同時,它也克服了在新增加產品角色的時候,我們不需要修改工廠角色。下面我們來看下Factory 方法模式的結構:
從可以看出,這個模式中涉及到了以下幾個角色:
A、抽象工廠角色:這個角色是Factory 方法模式的核心,它是與應用無關的,任何在模式中建立對象的工廠類都必須實現它。
B、具體工廠角色:該角色是實現了抽象工廠角色介面的具體類。具體工廠角色含有與應用密切相關的邏輯關係,並被調用建立產品對象。
C、抽象產品角色:Factory 方法模式所建立的對象的父類,也是產品對象的共同擁有的介面。
D、具體產品角色:這個角色實現了抽象產品角色,提供給Factory 方法進行建立對象。
下面我們以例子說明Factory 方法模式的具體使用,My Code如下:
抽象產品角色:
/* the role of abstract */
public abstract class WifiState {
private String wifiName;
private int wifiType;
private int ip;
public String getWifiName() {
return wifiName;
}
public void setWifiName(String wifiName) {
this.wifiName = wifiName;
}
public int getWifiType() {
return wifiType;
}
public void setWifiType(int wifiType) {
this.wifiType = wifiType;
}
public int getIp() {
return ip;
}
public void setIp(int ip) {
this.ip = ip;
}
}
具體產品角色(無需密碼WIFI):
/* the role of concret */
public class WifiStateNoPwd extends WifiState {
public WifiStateNoPwd() {
setWifiName("無密碼WIFI,可以直接使用哦!");
setWifiType(0);
setIp(1921682204);
}
}
具體產品角色(要求輸入密碼WIFI):
/* the role of concret */
public class WifiStateNeedPwd extends WifiState {
public WifiStateNeedPwd() {
setWifiName("只有輸入密碼才能使用的WIFI!");
setWifiType(1);
setIp(1921682205);
}
}
具體產品角色(收費的WIFI):
public class WifiStateCharges extends WifiState {
public WifiStateCharges() {
setWifiName("需要付費用的的WIFI!你願意使用嗎!");
setWifiType(2);
setIp(1921682206);
}
}
抽象工廠角色:
/* the role of abstract method */
public interface WifiFactory {
public WifiState factory();
}
具體工廠角色(無需密碼WIFI工廠):
/* the role of concret method */
public class WifiNoPwdFactory implements WifiFactory {
@Override
public WifiState factory() {
return new WifiStateNoPwd();
}
}
具體工廠角色(要求輸入密碼WIFI工廠):
/* the role of concret method */
public class WifiNeedPwdFactory implements WifiFactory {
@Override
public WifiState factory() {
return new WifiStateNeedPwd();
}
}
具體工廠角色(收費WIFI工廠):
/* the role of concret method */
public class WifiChargesFactory implements WifiFactory {
@Override
public WifiState factory() {
return new WifiStateCharges();
}
}
用戶端角色(client):
public class FactoryMethodActivity extends Activity {
private static String TAG = "VerifyFactoryMethodActivity";
private WifiFactory currFactory;
private WifiState currWifi;
@Override
protected void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_verify_factory_method);
// 不要求輸入密碼的WIFI
currFactory = new WifiNoPwdFactory();
currWifi = currFactory.factory();
log("WIFI資訊:"+currWifi.getWifiName() +"==="
+ currWifi.getWifiType() + "===" + currWifi.getIp());
// 要求輸入密碼的WIFI
currFactory = new WifiNeedPwdFactory();
currWifi = currFactory.factory();
log("WIFI資訊:"+currWifi.getWifiName() +"==="
+ currWifi.getWifiType() + "===" + currWifi.getIp());
// 收費的WIFI
currFactory = new WifiChargesFactory();
currWifi = currFactory.factory();
log("WIFI資訊:"+currWifi.getWifiName() +"==="
+ currWifi.getWifiType() + "===" + currWifi.getIp());
}
private void log(String log) {
Log.d(TAG, log);
}
}
在最後,附上我的程式啟動並執行:
到這裡,我們已經分析完了Factory 方法模式的原理及使用了。
技術交流群:179914858
Factory 方法模式在android的使用