工厂方法模式在android的使用

工厂方法模式(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

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。