这周在看代码时,看到别人的代码里用到了工厂设计模式,做为小白,所以来学习下。
我们首先来看一个例子,是女娲造人的例子,女娲需要造黑色、黄色和白色三种人。并且每种人分为男性和女性。
这个例子中就可以用到工厂设计模式。具体的类图如下:
接下来,我们来看看相关的实现,Human接口代码清单如下:
public interface Human {
//每个人都应该有相应的颜色
public void getColor();
//人类会说话
public void talk();
//每个人都有性别
public void getSex();
}
人种有三个抽象类,负责人种的抽象属性定义:肤色和语言。代码如下:
//白色人种
public abstract class AbstractWhiteHuman implements Human{
@Override
public void getColor() {
System.out.println("白色人种的皮肤颜色是白色的");
}
@Override
public void talk() {
System.out.println("白色人种会说话,一般说的都是单字节");
}
}
//黑色人种
public abstract class AbstractBlackHuman implements Human{
@Override
public void getColor() {
System.out.println("黑色人种的皮肤颜色是黑色的");
}
@Override
public void talk() {
System.out.println("黑色人种会说话,一般听不懂");
}
}
//黄色人种
public abstract class AbstractYellowHuman implements Human{
@Override
public void getColor() {
System.out.println("黄色人种的皮肤颜色是黄色的");
}
@Override
public void talk() {
System.out.println("黄色人种会说话,一般说的都是双字节");
}
}
每个抽象类都有两个实现类,分别实现公共的最细节、最具体的事物:皮肤和语言。以黄色女性人种威力,代码清单如下:
public class FemaleYellowHuman extends AbstractYellowHuman{
@Override
public void getSex() {
System.out.println("黄色人种女性");
}
}
public class MaleYellowHuman extends AbstractYellowHuman{
@Override
public void getSex() {
System.out.println("黄种男性");
}
}
其它的黑色人种,白色人种的男性和女性代码与此类似,不再重复编写。到此为止我们已经把真实世界的人种都定义出来了,剩下的工作就是怎么制造人类了。接口HumanFactory的代码清单如下:
public interface HumanFactory {
//制造一个黄色人种
public Human createYellowHuman();
//制造一个黑色人种
public Human createBlackHuman();
//制造一个白色人种
public Human createWhiteHuman();
}
接下来,我们在定义两个分别产生男性和女性的工厂类:
public class FemaleFactory implements HumanFactory{
//生产黄色女性
@Override
public Human createYellowHuman() {
return new FemaleYellowHuman();
}
//生产黑色女性
@Override
public Human createBlackHuman() {
return new FemaleBlackHuman();
}
//生产白色女性
@Override
public Human createWhiteHuman() {
return new FemaleWhiteHuman();
}
}
public class MaleFactory implements HumanFactory{
//生产黄色男性
@Override
public Human createYellowHuman() {
return new MaleYellowHuman();
}
//生产黑色男性
@Override
public Human createBlackHuman() {
return new MaleBlackHuman();
}
//生产白色男性
@Override
public Human createWhiteHuman() {
return new MaleWhiteHuman();
}
}
那么,接下来我们来看一下女娃造人的场景。
public class NvWa {
public static void main(String[] args){
//第一条生产线,男性生产线
HumanFactory maleHumanFactory = new MaleFactory();
//第二条生产线,女性生产线
HumanFactory femaleHumanFactory = new FemaleFactory();
//生产线建立完毕,开始造人
Human maleYellowHuman = maleHumanFactory.createYellowHuman();
Human femaleYellowHuman = femaleHumanFactory.createYellowHuman();
System.out.println("----生产一个黄色女性----");
femaleYellowHuman.getColor();
femaleYellowHuman.talk();
femaleYellowHuman.getSex();
System.out.println("----生产一个黄色男性----");
maleYellowHuman.getColor();
maleYellowHuman.talk();
maleYellowHuman.getSex();
/**
* 后面继续创建
*/
}