抽象工厂模式

定义:

所有形态的工厂模式中最为抽象和最具一般性的一种形态,为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。

例子:


分析:
接上一节”女娲造人例子”,有了丹炉去造人了,但是问题来了,新增了一个需求,造的人需要增加性别。简单的说,就是在工厂里面,生产的每一个实体,里面都有一个获取性别的方法。
同时:
也要也要增加分为男性和女性的工场。


直接上代码:

人类模块:

/**
* 人类接口
*/
public interface Human {
public void laugh();
public void cry();
public void talk();
public void sex();
}

/**
* 定义为抽象类,因为子类要定义性别
*/
public abstract class AbstractYellowHuman implements Human{

public void cry() {
System.out.println("黄色人类会哭");
}

public void laugh() {
System.out.println("黄色人类会大笑,幸福呀!");
}
public void talk() {
System.out.println("黄色人类会说话,一般说的都是双字节");
}
}

/**
* 女性黄种人
*/
public class YellowFemaleHuman extends AbstractYellowHuman{
public void sex() {
System.out.println("该黄种人的性别为女...");
}
}

/**
* 男性黄种人
*/
public class YellowMaleHuman extends AbstractYellowHuman {

public void sex() {
System.out.println("该黄种人的性别为男....");
}
}

工厂模块:

/**
*工厂类接口
*/
public interface HumanFactory {
//制造黄色人类
public Human createYellowHuman();

//制造一个白色人类
public Human createWhiteHuman();

//制造一个黑色人类
public Human createBlackHuman();
}

/**
* 抽象工厂
*/
public abstract class AbstractHumanFactory implements HumanFactory {

//给定一个性别人类,创建一个人类出来 专业术语是产生产品等级
protected Human createHuman(HumanEnum humanEnum) {

Human human = null;

//如果传递进来不是一个Enum中具体的一个Element的话,则不处理
if (!humanEnum.getValue().equals("")) {
try {
//直接产生一个实例
human = (Human)Class.forName(humanEnum.getValue()).newInstance();
} catch (Exception e) {
//因为使用了enum,这个种异常情况不会产生了,除非你的enum有问题;
e.printStackTrace();
}
return human;
}
}

/**
* 男性创建工厂
*/
public class MaleHumanFactory extends AbstractHumanFactory {

//创建一个男性黑种人
public Human createBlackHuman() {
return super.createHuman(HumanEnum.BlackMaleHuman);
}

//创建一个男性白种人
public Human createWhiteHuman() {
return super.createHuman(HumanEnum.WhiteMaleHuman);
}

//创建一个男性黄种人
public Human createYellowHuman() {
return super.createHuman(HumanEnum.YelloMaleHuman);
}
}

/**
* 女性创建工厂
*/
public class FemaleHumanFactory extends AbstractHumanFactory {
//创建一个女性黑种人
public Human createBlackHuman() {
return super.createHuman(HumanEnum.BlackFemaleHuman);
}
//创建一个女性白种人
public Human createWhiteHuman() {
return super.createHuman(HumanEnum.WhiteFemaleHuman);
}

//创建一个女性黄种人
public Human createYellowHuman() {
return super.createHuman(HumanEnum.YelloFemaleHuman);
}
}

主程序,开始造人

public class NvWa { 

public static void main(String[] args) {

//第一条生产线,男性生产线
HumanFactory maleHumanFactory = new MaleHumanFactory();

//第二条生产线,女性生产线
HumanFactory femaleHumanFactory = new FemaleHumanFactory();

//生产线建立完毕,开始生产人了:
Human maleYellowHuman = maleHumanFactory.createYellowHuman();

Human femaleYellowHuman = femaleHumanFactory.createYellowHuman();

maleYellowHuman.cry();
maleYellowHuman.laugh();
femaleYellowHuman.sex();

.......
}
}

总结:


抽象工厂模式,还有一个非常大的有点,高内聚,低耦合,在一个较大的项目组,产品是由一批人定义开发的,但是提供其他成员访问的时候,只有工厂方法和产品的接口,也就是说只需要提供Product Interface 和Concrete Factory 就可以产生自己需要的对象和方法,Java 的高内聚低耦合的特性表现的一览无遗,