一、java实现工厂模式:
类图注解:
AbstractHumanFactory是一个抽象类,定义了一个八卦炉具有的整体功能,HumanFactory为实现类,完成具体的任务(创建人类);
Human接口是人类的总称,其三个实现类分别问三类人种;
NvWa类是一个场景类,负责模拟场景,执行相关的任务;
实现代码如下:
package test_java_factory; /** * 人类总称 */ public interface Human { public void getColor(); public void talk(); }
package test_java_factory; /** *黑色人种 */ public class BlackHuman implements Human{ public void getColor(){ System.out.println("黑色人种的皮肤颜色是黑色的!"); } public void talk(){ System.out.println("黑人会说话,一般人听不懂!"); } }
package test_java_factory; /** * 黄色人种 */ public class YellowHuman implements Human{ public void getColor(){ System.out.println("黄种人的皮肤是黄色的!"); } public void talk(){ System.out.println("黄种人会说话,我们能听到!"); } }
package test_java_factory; /** * 白色人种 */ public class WhiteHuman implements Human{ public void getColor(){ System.out.println("白种人的皮肤为白色!"); } public void talk(){ System.out.println("白种人会说话,是英语!"); } }
package test_java_factory; /** * 抽象人类创建工厂 */ public abstract class AbstractHumanFactory { public abstract <T extends Human> T createHuman(Class<T> c); }
package test_java_factory; /** * 人类创建工厂 */ public class HumanFactory extends AbstractHumanFactory{ public <T extends Human> T createHuman(Class<T> c){ Human human = null; try { human = (Human) Class.forName(c.getName()).newInstance(); } catch (Exception e) { // TODO: handle exception System.out.println("人种生成错误!"); } return (T)human; } }
package test_java_factory; /** * 女娲场景类 */ public class NvWa { public static void main(String[] args){ AbstractHumanFactory lu = new HumanFactory(); System.out.println("第一批白种人:"); Human whiteHuman = lu.createHuman(WhiteHuman.class); whiteHuman.getColor(); whiteHuman.talk(); System.out.println("第二批黑种人: "); Human blackHuman = lu.createHuman(BlackHuman.class); blackHuman.getColor(); blackHuman.talk(); System.out.println("第三批黄种人:"); Human yellowHuman = lu.createHuman(YellowHuman.class); yellowHuman.getColor(); yellowHuman.talk(); } }
二、javascript实现工厂模式:
简单工厂模式是由一个方法来决定到底要创建哪个类的实例, 而这些实例经常都拥有相同的接口.
这种模式主要用在所实例化的类型在编译期并不能确定, 而是在执行期决定的情况。简单工厂模式在创建ajax对象的时候也非常有用.
几种ajax请求的方式,包括xhr对象的get, post, 也包括跨域用的jsonp和iframe.
为了方便使用, 这几种方式都抽象到了同一个接口里面.
var request1 = Request('cgi.xx.com/xxx' , ''get' ); request1.start(); request1.done( fn ); var request2 = Request('cgi.xx.com/xxx' , ''jsonp' ); request2.start(); request2.done( fn );
Request实际上就是一个工厂方法, 至于到底是产生xhr的实例, 还是jsonp的实例. 是由后来的代码决定的。
实际上在js里面,所谓的构造函数也是一个简单工厂。只是批了一件new的衣服. 我们扒掉这件衣服看看里面。
function A( name ){ this.name = name; } function ObjectFactory(){ var obj = {}, Constructor = Array.prototype.shift.call( arguments ); obj.__proto__ = typeof Constructor .prototype === 'number' ? Object.prototype : Constructor .prototype; var ret = Constructor.apply( obj, arguments ); return typeof ret === 'object' ? ret : obj; } var a = ObjectFactory( A, 'svenzeng' ); alert ( a.name ); //svenzeng