一、关于工厂模式
工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见。因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑使用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。
总结:工厂模式用来创建实例对象。
工厂模式在一些需要生成复杂对象的情景下建议使用,但是简单的需求,特别是只需要new就创建对象的时候,其实是不建议去使用工厂模式的,我们在使用工厂模式的时候,必须要引入一个Factory类,这增加了系统的复杂度,所以工厂模式的选择,需要设计者自己去判断。
优点:1。程序获取对象的时候,不用再关心对象实现的过程,通过对象名可以直接获取到对象实例;2.提高了程序的扩展性,需要新增一个类的时候,直接扩展工厂类即可。
缺点:增加了系统的复杂度。
使用场景
1、日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。
2、数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。
3、设计一个连接服务器的框架,需要三个协议,"POP3"、"IMAP"、"HTTP",可以把这三个作为产品类,共同实现一个接口。
二、实现
五种不同的计费方式背景下的工厂模式实现
1.创建FeeInterface.java接口(抽象产品)
/**
* \* User: Baldwin
* \* E_Mail: [email protected] || [email protected]
* \* Date: 2020/3/16
* \* Time: 12:16
* \* Description:
* \
*/
public interface FeeInterface {
String getToken();
String reqFee();
}
接口中定义两个方法
2.分别创建三种计费封装类,并继承FeeInterface接口(具体产品)
import cn.yzstu.factory.fee.FeeInterface;
/**
* \* User: Baldwin
* \* E_Mail: [email protected] || [email protected]
* \* Date: 2020/3/16
* \* Time: 12:18
* \* Description:
* \
*/
public class GzFee implements FeeInterface {
public String getToken() {
return "GzToken";
}
public String reqFee() {
return "GzFee";
}
}
import cn.yzstu.factory.fee.FeeInterface;
/**
* \* User: Baldwin
* \* E_Mail: [email protected] || [email protected]
* \* Date: 2020/3/16
* \* Time: 12:19
* \* Description:
* \
*/
public class MelonFee implements FeeInterface {
public String getToken() {
return "MelonToken";
}
public String reqFee() {
return "MelonFee";
}
}
import cn.yzstu.factory.fee.FeeInterface;
/**
* \* User: Baldwin
* \* E_Mail: [email protected] || [email protected]
* \* Date: 2020/3/16
* \* Time: 12:20
* \* Description:
* \
*/
public class BeiJingFee implements FeeInterface {
public String getToken() {
return "BeiJingoken";
}
public String reqFee() {
return "BeiJingFee";
}
}
3.创建FeeFactory工厂类(具体工厂)
import cn.yzstu.factory.fee.FeeInterface;
import cn.yzstu.factory.fee.impl.BeiJingFee;
import cn.yzstu.factory.fee.impl.GzFee;
import cn.yzstu.factory.fee.impl.MelonFee;
/**
* \* User: Baldwin
* \* E_Mail: [email protected] || [email protected]
* \* Date: 2020/3/16
* \* Time: 12:02
* \* Description:
* \
*/
public class FeeFactory {
public FeeInterface getFee(String feeName){
if (feeName == null) return null;
FeeInterface feeInterface;
if ("gzfee".equals(feeName)) {
feeInterface = new GzFee();
} else if ("MelonFee".equals(feeName)) {
feeInterface = new MelonFee();
} else if ("BeiJing".equals(feeName)) {
feeInterface = new BeiJingFee();
}else {
feeInterface = null;
}
return feeInterface;
}
}
4.应用类(产品使用者)
import cn.yzstu.factory.fee.FeeInterface;
/**
* \* User: Baldwin
* \* E_Mail: [email protected] || [email protected]
* \* Date: 2020/3/16
* \* Time: 12:31
* \* Description:
* \
*/
public class Demo {
public static void main(String[] args) {
FeeInterface fee = FeeFactory.getFee("BeiJing");
System.out.println(fee.reqFee());
}
}
5.运行结果