女娲造人的故事
东汉《风俗通》记录了一则神话故事:“开天辟地,未有人民,女娲搏黄土做人”,讲述
的内容就是大家非常熟悉的女娲造人的故事。开天辟地之初,大地上并没有生物,只有苍茫
大地,纯粹而洁净的自然环境,寂静而又寂寞,于是女娲决定创造一个新物种(即人类)来
增加世界的繁荣,怎么制造呢?
别忘了女娲是神仙,没有办不到的事情,造人的过程是这样的:首先,女娲采集黄土捏
成人的形状,然后放到八卦炉中烧制,最后放置到大地上生长,工艺过程是没有错的,但是
意外随时都会发生:
第一次烤泥人,感觉应该熟了,往大地上一放,哇,没烤熟!于是一个白人诞生了!
(这也是缺乏经验的最好证明。)
第二次烤泥人,上一次没烤熟,这次多烤一会儿,放到世间一看,嘿,熟过头了,于是
黑人诞生了!
第三次烤泥人,一边烧制一边察看,直到表皮微黄,嘿,刚刚好,于是黄色人种出现
了!
这个造人过程是比较有意思的,是不是可以通过软件开发来实现这个过程呢?古人
云:“三人行,必有我师焉”,在面向对象的思维中,万物皆对象,是对象我们就可以通过软
件设计来实现。首先对造人过程进行分析,该过程涉及三个对象:女娲、八卦炉、三种不同
肤色的人。女娲可以使用场景类Client来表示,八卦炉类似于一个工厂,负责制造生产产品
(即人类),三种不同肤色的人,他们都是同一个接口下的不同实现类,都是人嘛,只是肤
色、语言不同,对于八卦炉来说都是它生产出的产品。分析完毕,我们就可以画出如图
所示的类图。
类图比较简单,AbstractHumanFactory是一个抽象类,定义了一个八卦炉具有的整体功
能,HumanFactory为实现类,完成具体的任务——创建人类;Human接口是人类的总称,其
三个实现类分别为三类人种;NvWa类是一个场景类,负责模拟这个场景,执行相关的任
务。
我们定义的每个人种都有两个方法:getColor(获得人的皮肤颜色)和talk(交谈)
package FactoryP;
public interface Human {
public void color();
public void talk();
}
package FactoryP;
public class BlackHuman implements Human{
@Override
public void color() {
System.out.println("黑皮肤");
}
@Override
public void talk() {
System.out.println("speak hei language");
}
}
package FactoryP;
public class WhiteHuman implements Human{
@Override
public void color() {
System.out.println("白皮肤");
}
@Override
public void talk() {
System.out.println("speak English");
}
}
package FactoryP;
public class YellowHuman implements Human{
@Override
public void color() {
System.out.println("黄皮肤");
}
@Override
public void talk() {
System.out.println("speak Chinese");
}
}
package FactoryP;
/*说实话自己对泛型还是不够理解
在这里采用了泛型(Generic),通过定义泛型对createHuman的输入参数产
生两层限制:
● 必须是Class类型;
● 必须是Human的实现类。
其中的"T"表示的是,只要实现了Human接口的类都可以作为参数,泛型是JDK 1.5中的
一个非常重要的新特性,它减少了对象间的转换,约束其输入参数类型,对Collection集合下
的实现类都可以定义泛型。有关泛型的详细知识,请参考相关的Java语法文档。*/
public abstract class AbstractHunamFactory {
public abstract <T extends Human> T createHuman(Class<T> c);
}
package FactoryP;
public class NvWa {
public static void main(String[] args){
System.out.println("第一批人");
AbstractHunamFactory firstWhite = new HumanFactory();
Human whitehuman = firstWhite.createHuman(WhiteHuman.class);
whitehuman.color();
whitehuman.talk();
System.out.println("第二批人");
AbstractHunamFactory secondBlack = new HumanFactory();
Human blackhuman = secondBlack.createHuman(BlackHuman.class);
blackhuman.color();
blackhuman.talk();
System.out.println("第三批人");
AbstractHunamFactory therdYellow = new HumanFactory();
Human yellowhuman = therdYellow.createHuman(YellowHuman.class);
yellowhuman.color();
yellowhuman.talk();
}
}
通过以上例子,对工厂模式应该很理解了。
工厂方法模式使用的频率非常高,在我们日常的开发中总能见到它的身影。其定义为:
Define an interface for creating an object,but let subclasses decide which class to
instantiate.Factory Method lets a class defer instantiation to subclasses.(定义一个用于创建对象的
接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。)通用模板:在工厂方法模式中,抽象产品类Product负责定义产品的共性,实现对事物最抽象的定
义;Creator为抽象创建类,也就是抽象工厂,具体如何创建产品类是由具体的实现工厂
ConcreteCreator完成的。工厂方法模式的变种较多,我们来看一个比较实用的通用源码。
结合以前JFinal做过的项目,工厂模式用在POJO那部分。