23种设计模式之工厂方法模式
2015-06-18 17:03
369 查看
嗯嗯,我们来以女娲造人为例子吧,AbstractHumanFactory类是一个抽象类,定义了一个八卦炉具有的功能。
HumanFactory是实现类,完成创建人类的。
Human接口是人类总称。
其他三个类分别是三类人种:NvWa类是一个场景类,负责模拟这个场景。
我们定义的每个人种都有两个方法:getColor()获取人类皮肤的颜色,和talk交谈。代码如下:
人类总称:
黑色人种:
所有人种定义完毕,下一步就是定义一个八卦炉,然后造人。想象一下,女娲能给八卦炉下达什么命令呢?应该是给我产生出一个黄人,而不是给我产生一个会走会跑会说话的***人种。因为这样的命令增加了交流的成本。作为一个生产的管理者,只要知道产生什么就可以了,而不需要事务的具体信息。通过分析我们发现八卦炉生产人类的方法输入参数类型应该是Human接口的实现类,代码如下:
1必须是class类型;
2必须是Human的实现类;
目前女娲只有一个八卦炉,其实现产生人类的方法,代码如下:
女娲类
人类生产出来了,以上就是工厂方法模式。
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(); } }运行结果如下:
白色人种的皮肤是白色的 白色人种会说话,一般都说单字 黑色人种的皮肤是黑色的 黑人会说话,一般人听不懂呢 ***人种的皮肤是***的 ***人种会说话,一般人说的是双字
人类生产出来了,以上就是工厂方法模式。
相关文章推荐
- WCF广州本田整车销售系统技术解析(六) 三个下拉框之间的级联关系实现
- 心愿:做一个精简版MFC
- UML学习-时序图
- 自定义 404 与 500 错误页面,URL 地址不会重定向(二)
- 第二阶段冲刺报告(二)
- Win7系统桌面不能自动刷新怎么办?
- RHEL5 安装 Oracle 11g
- PostgreSQL基本调优知识,Update效率优化
- 分支-12 计算火车运行时间(15)
- iOS开发-UISwipeGestureRecognizer滑动手势
- .NET泛型解析(下)
- QT设计界面遍历文件夹进而计算hash码
- 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验二十八:TFT模块 - 触屏
- RHEL5 安装 Oracle 10g
- 动态改变view的style
- Auto Layout NSLayoutConstraint 界面布局
- Linux 挂载概念 理解
- AVFormatContext
- jQuery uploadify3.2 属性里没有cancelImg或cancelImage属性
- Java中的静态块语句、块语句精研