设计模式入门之工厂方法模式FactoryMethod

N天之后,终于看懂这个模式了...我发现我在没有学会1+1之前,先去玩儿1+2去了...

//工厂方法模式定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类,FactoryMethod使一个类都实例化延迟到其子类
//之前一直没有理解这个模式为什么要这么做
//首先感受下没有用工厂方法模式的情况
public class ExportFileApi {
	public boolean export(String data);
}
public class ExportTxtFile extends ExportFileApi {
	public boolean export(String data) {
		System.out.println("成功导出"+data+"到Txt文件");
		return true;
	}
}
public class ExportDbFile extends ExportFileApi {
	public boolean export(String data) {
		System.out.println("成功功导出"+data+"到Db文件");
		return false;
	}
}
public class Client {
	public static void main(String[] args) {
		ExportFileApi exp = new ExportTxtFile();
		exp.export("测试数据");
	}
}
//还是感觉没有用工厂方法模式挺好的...(之后又看了下书的开头有这样一句话:面向接口编程,系统外部不应该知道或了解具体实现(实现类))
//这样一看貌似理解了一点这个模式了
//======================================================
//再来看看用了工厂方法模式的情况
public abstract class ExportOperate {
	public boolean export(String data) {
		ExportFileApi api = factoryMethod();
		return api.export(data);
	}
	protected abstract ExportFileApi factoryMethod();
}
//这里用到了抽象类,至于原因,应该是书中的这句话吧(1.优先使用接口,2.当只需要定义子类都行为时用接口,又要为子类提供公共的功能时用抽象类)
//很明显export方法就是子类的公共方法(应该就是这个意思吧)
public class ExportTxtFileOperate extends ExportOperate {
	protected ExportFileApi factoryMethod() {
		return new ExportTxtFile();
	}
}
public class ExportDbFileOperate extends ExportOperate {
	protected ExportFileApi factoryMethod() {
		return new ExportDbFile();
	}
}
public class Client {
	public static void main(String[] args) {
		ExportOperate operate = new ExportDbFileOperate();
		operate.export("测试数据");
	}
}
//这下再看客户端(即系统外部),实例化的只是一个操作对象,而不是具体都实现对象了
//一步一步按照一些原则用自己的思路和方法实现了一下,经过一次次抽象,最终跟上边都工厂方法很相似
//感觉工厂方法模式应用应该非常广泛
//本来到此可以结束了,再次看看看参数化工厂方法,突然蒙了
public class ExportOperate {
	public boolean export(int type,String data) {
		ExportFileApi api = factoryMethod(type);
		return api.export(data);
	}
	protected ExportFileApi factoryMethod(int type) {
		ExportFileApi api = null;
		if(type==1) {
			api = new ExportTxtFile();
		}else if(type==2) {
			api = new ExportDbFile();
		}
		return api;
	}
}
public class Client {
	public static void main(String[] args) {
		ExportOperate operate = new ExportOperate();
		operate.export(1,"测试数据");
	}
}
//我在自己实现都时候用到了这种方法,可是一味得去理解面向接口编程,结果觉得这样是面向对象编程方法不好...
//没想到这种方法美其名曰 参数化工厂方法
//到这里突然又理解类工厂方法模式的本质---把具体实现延迟到子类当中,这样的话以上这两种方法都可以理解了
//另外,工厂方法模式很好地体现类“依赖倒置原则”,依赖---要依赖抽象,不要依赖于具体类
//倒置---接口的所有权倒置到高层组件中去了,因为是高层组件提出的接口需求

//感觉这三个月的工作假期太值了,在厦门大学这样一个非常有学习氛围的地方跟学生们一起学习
//只有离开了学校才知道学校的好,真的,在学校真好,好想回到从前
//让我能够把以前在学校没有好好学的知识多多少少补回来一些,很幸运,很感激


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值