23种设计模式之工厂方法模式

嗯嗯,我们来以女娲造人为例子吧,AbstractHumanFactory类是一个抽象类,定义了一个八卦炉具有的功能。

HumanFactory是实现类,完成创建人类的。

Human接口是人类总称。

其他三个类分别是三类人种:NvWa类是一个场景类,负责模拟这个场景。

      我们定义的每个人种都有两个方法:getColor()获取人类皮肤的颜色,和talk交谈。代码如下:


人类总称:

package demo;

public interface Human {
	//每个人的皮肤都有相应的颜色
	public void getColor();
	
	//人类会说话
	public void talk();
	
	

}
Human接口是对人类的总称,每个人种至少有两种方法,黑色、黄色、白色。代码分别如下:

黑色人种:

package demo;

public class BlackHuman implements Human {

	@Override
	public void getColor() {
		// TODO Auto-generated method stub
System.out.println("黑色人种的皮肤是黑色的");
	}

	@Override
	public void talk() {
		// TODO Auto-generated method stub
System.out.println("黑人会说话,一般人听不懂呢");
	}

}
黄色人种:

package demo;

public class YellowHuman implements Human {

	@Override
	public void getColor() {
		// TODO Auto-generated method stub
System.out.println("黄色人种的皮肤是黄色的");
	}

	@Override
	public void talk() {
		// TODO Auto-generated method stub
System.out.println("黄色人种会说话,一般人说的是双字");
	}

}
白色人种:

package demo;

public class WhiteHuman implements Human {

	@Override
	public void getColor() {
		// TODO Auto-generated method stub
System.out.println("白色人种的皮肤是白色的");
	}

	@Override
	public void talk() {
		// TODO Auto-generated method stub
System.out.println("白色人种会说话,一般都说单字");
	}

}

所有人种定义完毕,下一步就是定义一个八卦炉,然后造人。想象一下,女娲能给八卦炉下达什么命令呢?应该是给我产生出一个黄人,而不是给我产生一个会走会跑会说话的黄色人种。因为这样的命令增加了交流的成本。作为一个生产的管理者,只要知道产生什么就可以了,而不需要事务的具体信息。通过分析我们发现八卦炉生产人类的方法输入参数类型应该是Human接口的实现类,代码如下:

package demo;

public abstract class AbstractHumanFactory {
	
	public abstract <T extends Human> T createHuman(Class<T> c);

}
我们这里采用了泛型,通过泛型对createHuman的输入参数产生两层的限制:

1必须是class类型;

2必须是Human的实现类;

目前女娲只有一个八卦炉,其实现产生人类的方法,代码如下:

package demo;

public class HumanFactory extends AbstractHumanFactory {

	@Override
	public <T extends Human> T createHuman(Class<T> c) {
		Human human = null;//定义一个生产的人种
		try {
			human = (Human)Class.forName(c.getName()).newInstance();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		return (T)human;
	}

}
人种有了,八卦炉有了,剩下的工作就是女娲采集黄土,下达命令八卦炉开始生产,代码如下:

女娲类

package demo;

public class NvWa {
	public static void main (String[] agrs){
		//声明阴阳八卦炉
		AbstractHumanFactory yinyang = new HumanFactory();
		//女娲造人火候不足,产生了白人
		Human whiteHuman = yinyang.createHuman(WhiteHuman.class);
		whiteHuman.getColor();
		whiteHuman.talk();
		//火候过足,产生了黑人
		Human blackHuman = yinyang.createHuman(BlackHuman.class);
		blackHuman.getColor();
		blackHuman.talk();
		//火候刚刚好,产生了黄人
		Human yellowHuman = yinyang.createHuman(YellowHuman.class);
		yellowHuman.getColor();
		yellowHuman.talk();
	}

}
运行结果如下:

白色人种的皮肤是白色的
白色人种会说话,一般都说单字
黑色人种的皮肤是黑色的
黑人会说话,一般人听不懂呢
黄色人种的皮肤是黄色的
黄色人种会说话,一般人说的是双字

人类生产出来了,以上就是工厂方法模式。






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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值