工厂方法模式(Factory Method)
工厂方法模式是类的创建模式,又叫做多态性工厂模式。这个模式的用意在于定义一个创建产品对象的工厂接口,并将实际的创建工作推迟到工厂子类中去完成。
工厂模式支持继承机制,同时,它也克服了在新增加产品角色的时候,我们不需要修改工厂角色。下面我们来看下工厂方法模式的结构示意图:
从上图可以看出,这个模式中涉及到了以下几个角色:
A、抽象工厂角色:这个角色是工厂方法模式的核心,它是与应用无关的,任何在模式中创建对象的工厂类都必须实现它。
B、具体工厂角色:该角色是实现了抽象工厂角色接口的具体类。具体工厂角色含有与应用密切相关的逻辑关系,并被调用创建产品对象。
C、抽象产品角色:工厂方法模式所创建的对象的父类,也是产品对象的共同拥有的接口。
D、具体产品角色:这个角色实现了抽象产品角色,提供给工厂方法进行创建对象。
下面我们以例子说明工厂方法模式的具体使用,我的代码如下:
抽象产品角色:
/* 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);
}
}
在最后,附上我的程序运行的效果图:
到这里,我们已经分析完了工厂方法模式的原理及使用了。
技术交流群:179914858