简单工厂模式(Simple Factory)
简单工厂模式是类的创建模式,又叫做静态工厂方法模式(Static Factory Method)。简单工厂模式是由一个工厂来决定创建哪一种类的实例,下面为它的结构图:
从上面的结构图看到,简单工厂模式涉及到了工厂角色、抽象产品角色以及具体产品角色等三个角色。
A、工厂角色:该角色是简单工厂模式中的核心角色,其含有与应用紧密相关的逻辑;工厂角色在客户端的调用下决定具体创建哪个类。
B、抽象产品角色:该角色是工厂角色创建的对象的父类,是创建对象的共同接口,一般这个接口由Java中的接口或抽象类来实现。
C、具体产品角色:工厂方法创建的任何对象都是这个类的实例,它是抽象产品角色的具体实现。
注意:
在Java当中,我们一般把一些具有相同的特性,但没有逻辑关系的对象用Java的接口来实现;而相反的把一些具有相似特性并且拥有某种逻辑关系的对象使用Java抽象类来实现。
下面举个例子来印证简单工厂模式的使用。例子是这样的,我们搜索WIFI信号,并根据WIFI的公开类型来选择不同的上网方式,分为三种方式:需要密码、不需要密码及收费的三种类型。当搜索返回的WIFI信息中的wifiType为0代表不需要密码免费,为1代表需要密码,为2的时候即代表着收费的,这里我在Android项目实现的。
抽象产品角色(WifiState):
/* the role of abstract */
public abstract class WifiState {
StringwifiName;
int wifiType;
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;
}
}
具体产品角色(WifiStateNoPwd):
/* the role of concret */
public class WifiStateNoPwd extends WifiState {
public WifiStateNoPwd() {
setWifiName("我是不需要密码的WIFI!");
setWifiType(0);
setIp(1921680202);
}
}
具体产品角色(WifiStateNeedPwd):
/* the role of concret */
public class WifiStateNeedPwd extends WifiState {
public WifiStateNeedPwd() {
setWifiName("我是需要密码的WIFI!");
setWifiType(1);
setIp(1921680203);
}
}
具体产品角色(WifiStateCharges):
/* the role of concret */
public class WifiStateCharges extends WifiState {
public WifiStateCharges() {
setWifiName("我是收费的WIFI!");
setWifiType(2);
setIp(1921680204);
}
}
工厂角色(WifiFactory):
/* therole of factory */
public class WifiFactory{
public staticWifiState factory(int wifiType) {
WifiStatecurrWifi = null;
switch(wifiType) {
case 0:
currWifi = new WifiStateNoPwd();
break;
case 1:
currWifi = new WifiStateNeedPwd();
break;
case 2:
currWifi = new WifiStateCharges();
break;
default:
break;
}
return currWifi;
}
}
在最后贴上效果图:
很明显,我们利用了工厂根据不同的条件创建了多个的实例对象,这就是简单工厂的一个模拟实现。那么接下来,讨论下它的优缺点:
优点:
模式的核心是工厂类,这个类含有重要的判断逻辑,可以决定在什么时候创建那个实例;同时,它也避免了客户端直接创建产品的任务,而只负责消费产品,这样很好的达到了将客户端与产品层对责任的分割。
缺点:
缺点也很明显,第一,这个模式下的工厂类集中了所有的判断逻辑,成为无所不能的创造类,那么一旦这个类出现某些问题,那么整个系统就直接出现了问题;第二,当产品类有不同的接口时,工厂类需要知道在什么时候创建某种产品,这就对时机的判断和对那种产品的创建混在了一起,这样在以后进行拓展时就会很麻烦(工厂方法模式解决了这个问题);第三,很明显简单工厂使用了静态工厂方法的形式创建对象,因此工厂角色就不能使用继承的等级结构(工厂方法模式解决了这个问题)。
注意:
在某种程度上,简单工厂模式也达到了有限程度的“开-闭”原则。
好了,简单工厂模式就总结到这里了,接下来会继续分析在很大程度上克服了简单工厂模式的新模式---工厂方法模式。
技术交流群:179914858