编程的过程中如果程序模块要调用一个接口类的功能,就必须先有生成的一个接口类实例对象,而接口对象又无法由接口自己生成,必须由实现接口的子类或则接口的实现类来生成。如果把调用接口的程序称为业务模块,那么类比现实社会,接口的实例对象就是产品,业务模块就是客户。在这里我们把冰箱的功能要求(即对冰箱模具的要求或冰箱者模具的模具)类比为程序的接口(一组方法规范的集合),冰箱的款式(即冰箱的模具)类比为程序中实现接口的一个接口的子类。
客户使用(符合对模具所要求的功能的)冰箱的功能(客户使用用符合功能要求的冰箱功能) 对应业务模块使用接口对象的方法
最终的简化业务模型如下:客户就是“用一下冰箱”,对应的软件模型是 业务模块“使用一下接口对象”。这就牵涉到由谁来生成冰箱的问题
方法一:业务模块自生成接口对象。由客户自己生成冰箱,然后自己用。方法二:工厂模式生成接口对象。 由客户向工厂下订单有工厂生产出冰箱,然后客户再使用。然而这两种方式有什么本质的区别呢?我们逐一实现,先看第一种方式:
客户使用冰箱包括第一步造出冰箱,第二步使用冰箱。客户要使用普通型冰箱,必须先选模具1然后用模具1造出普通冰箱
现实社会与软件社会的对应关系如下图:
如果:客户对冰箱的型号要求发生变化,要用“时尚冰箱”,那么客户必须从新选择模具2造出“时尚冰箱”,客户的流程就要变化。对应到软件世界,业务模块的代码就要相应的进行更改。如下图:
这样的结果就是客户使用不同型号的冰箱,客户就要进行一次模具的选择,客户流程随着客户选用的冰箱型号的变化而变化。对于软件业务模块而言要是对冰箱的款式要求有变化,就要选择不同的子类,业务模块随需求的冰箱款式的变化而变化。
如果软件又扩展了接口的新子类的数量,客户想要选择新款的冰箱,就又要选择出新款模具,生产新款冰箱,客户的使用流程中又要有变化。
结论:业务模块自生成接口对象 的点
1、软件业务模型随着所要求的新的子类对象的变化而变化。
2、软件在编译阶段之前业务模块就有接口子类对象的实例化代码,业务模块代码在编译的时候便对子类的实例进行了编译,编译后的程序在运行时不能再变更业务子类对象的选择。换句话说业务模块编译后,只能使用固定的子类对象以及对象的方法。程序被写死啦!程序要运行新的子类对象,必须重写程序的业务模块,重新编译。同理,如果接口有了新的实现子类,想用只有重写业务代码重新编译。耦合度太深。对于网路程序而言,业务模块算是前台调用的模块,相当于前台也要重写重新编译。
方法二:工厂模式生成接口对象。