设计模式之禅笔记——工厂模式

一、java实现工厂模式:

设计模式之禅笔记——工厂模式_第1张图片

类图注解:

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

  所谓的new, 本身只是一个对象的复制和改写过程,
  而具体会生成什么是由调用ObjectFactory时传进去的参数所决定的。




你可能感兴趣的:(设计模式,工厂模式)