简单工厂模式(Simple Factory)

简单工厂模式(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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云水之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值