工厂方法模式(Factory Method)

@@@模式定义:
定义一个用于创建对象(interface)的接口(这里的"接口"不是指interface而是method),
让子类(通过override父类创建interface的method来)决定实例化哪一个类,
Factory Method使一个类(interface)的实例化延迟到其(指Factory Method所在的类)子类。


@@@练习示例: 
导出数据的应用框架。


@@@示例代码:
src/export/ExportFileApi.java

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

package export;

/**
 * 导出文件对象的接口
 */
public interface ExportFileApi {
    /**
     * 导出内容成为文件
     * @param data: 示意需要保存的数据
     * @return 是否导出成功
     */
	public boolean export(String data);
}

src/export/ExportTxtFile.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

package export;

/**
 * 导出成文本文件格式的对象
 */
public class ExportTxtFile implements ExportFileApi {
    public boolean export(String data) {
        //简单示意一下,这里需要操作文件
    	System.out.println("导出数据" + data + "到文本文件");
    	return true;
    }
}

src/export/ExportDB.java
~~~~~~~~~~~~~~~~~~~~~~~~
package export;

/**
 * 导出成数据库备份文件形式的对象
 */
public class ExportDB implements ExportFileApi {
	public boolean export(String data) {
		//简单示意一下,这里需要操作数据库和文件
    	System.out.println("导出数据" + data + "到数据库备份文件");
		return true;
	}
}

src/export/ExportOperate.java

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


package export;

/**
 * 实现导出数据的业务功能对象
 */
public class ExportOperate {
    /**
     * 导出文件
     * @param type 用户选择的导出类型
     * @param data 需要保存的数据
     * @return 是否成功导出文件
     */
	public boolean export(int type, String data) {
		//使用工厂方法
		ExportFileApi api = factoryMethod(type);
		return api.export(data);
	}
	
	/**
	 * 工厂方法,创建导出的文件对象的接口对象
	 * @param type 用户选择的导出类型
	 * @return 导出的文件对象的接口对象
	 */
	protected ExportFileApi factoryMethod(int type) {
		ExportFileApi api = null;
		
		if (1 == type) {
			api = new ExportTxtFile();
		} else if (2 == type) {
			api = new ExportDB();
		}
		
		return api;
	}
}

src/export/ExportTxtFileOperate.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

package export;

/**
 * 具体的创建器实现对象,实现创建导出成文本格式的对象
 */
public class ExportTxtFileOperate extends ExportOperate {
	protected ExportFileApi factoryMethod() {
        //创建导出成文本格式的对象
		return new ExportTxtFile();
	}
}

src/export/ExportDBOperate.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

package export;

/**
 * 具体的创建器实现对象,实现创建导出成数据库备份文件形式的对象
 */
public class ExportDBOperate extends ExportOperate {
	protected ExportFileApi factoryMethod() {
		//创建导出成文本格式的对象
		return new ExportDB();
	}

}

src/export/ExportXml.java
~~~~~~~~~~~~~~~~~~~~~~~~~

package export;

/**
 * 导出成xml文件的对象
 */
public class ExportXml implements ExportFileApi {
    public boolean export(String data) {
    	// 简单示意一下
    	System.out.println("导出数据" + data + "到XML文件");
    	return true;
    }
}

src/export/ExportOperate2.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

package export;

/**
 * 扩展ExportOperate对象,加入可以导出的XML文件
 */
public class ExportOperate2 extends ExportOperate {
    /**
     * 覆盖父类的工厂方法,创建导出的文件对象的接口对象
     * @param type 用户选择的导出类型
     * @return 导出的文件对象的接口对象
     */
	protected ExportFileApi factoryMethod(int type) {
        ExportFileApi api = null;
        // 可以全部覆盖,也可以选择自己感兴趣的覆盖
        // 这里只添加自己新的实现,其他的不管
        if (3 == type) {
            api = new ExportXml();        	
        } else {
        	// 其他的还是让父类来实现
        	api = super.factoryMethod(type);
        }
        
        return api;
	}
}

src/user/Client.java
~~~~~~~~~~~~~~~~~~~~

package user;

import export.ExportOperate;
import export.ExportOperate2;

public class Client {
	public static void main(String[] args) {
		// 创建需要使用的Creator对象
		ExportOperate operate = new ExportOperate2();
		// 下面变换传入的参数来测试参数化工厂方法
		operate.export(1, "Test1");
		operate.export(2, "Test2");
		operate.export(3, "Test3");
	}
}

@@@工厂方法模式的实现:
1. 一般实现成抽象类
2. 也可以实现成具体的类
3. 可以通过给工厂方法传递参数来选择实现
4. 工厂方法一般返回的是被创建对象的接口对象
5. 在工厂方法模式里面,是Creator中的其他方法在使用工厂方法创建的对象
6. 工厂方法一般不提供给外部使用(用protected修饰)
7. 可以使用工厂方法模式来连接平行的类层次


@@@工厂方法模式的优点 :
1. 可以在不知道所依赖的对象的具体实现的情况下编程
2. 更容易扩展对象的新版本


@@@工厂方法模式的缺点 :
1. 具体产品对象和工厂方法的耦合性


@@@工厂方法模式的本质:
延迟到子类来选择实现


@@@工厂方法模式体现的设计原则 :
依赖倒置原则






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值