抽象工厂模式:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。
人种接口
public interface Human
{
//每个人种的皮肤都有相应的颜色
public abstract void getColor();
//人类会说话
public abstract void talk();
//人类有性别
public abstract void getSex();
}
人种有三个抽象类,负责人种的抽象属性定义:肤色和语言。黑色人种、白色人种、黄色人种。
//黑色人种抽象类
public abstract class AbstractBlackHuman implements Human
{
@Override
public void getColor()
{
System.out.println("黑种人黑色皮肤");
}
@Override
public void talk()
{
System.out.println("黑种人说印度语");
}
}
//白色人种抽象类
public abstract class AbstractWhiteHuman 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 FemaleBlackHuman extends AbstractBlackHuman
{
@Override
public void getSex()
{
System.out.println("黑人女性");
}
}
public class MaleBlackHuman extends AbstractBlackHuman
{
@Override
public void getSex()
{
System.out.println("黑人男性");
}
}
另外两个抽象类的实现相类似,不再赘述。
产品类说清楚了,接下来说工厂类。主要有两个工厂类,一个是男性工厂类,一个是女性工厂类。
工厂类的接口
public interface HumanFactory
{
//制造一个黑人
public Human createBlackHuamn();
//制造一个白人
public Human createWhiteHuman();
//制造一个黄人
public Human createYellowHuman();
}
男性工厂类的接口实现
public class MaleFactory implements HumanFactory
{
@Override
public Human createBlackHuamn()
{
return new MaleBlackHuman();
}
@Override
public Human createWhiteHuman()
{
return new MaleWhiteHuman();
}
@Override
public Human createYellowHuman()
{
return new MaleYellowHuman();
}
}
女性工厂类的接口实现
public class FemaleFactory implements HumanFactory
{
@Override
public Human createBlackHuamn()
{
return new FemaleBlackHuman();
}
@Override
public Human createWhiteHuman()
{
return new FemaleWhiteHuman();
}
@Override
public Human createYellowHuman()
{
return new FemaleYellowHuman();
}
}
针对以上两个工厂类,可以创建不同性别不同肤色的人。
以上模式就HumanFactory.java接口依赖Human.java接口,而不需要指定他们具体的实现类。
在抽象工厂模式中,AbstractBlackHuman,AbstractWhiteHuman,AbstractYellowHuman等抽象类可以定义为产品族,HumanFactory定义为抽象工厂。
需要注意:有N个产品族,在抽象工厂类中就应该有N个创建方法。
需要注意:有M个产品等级就应该有M个实现工厂类,每个实现工厂中,实现不同产品族的生产任务。
在这样的设计模式中,没有任何一个方法与实现类有关系,对于一个产品来说,我们只要知道它的工厂方法就可以直接产生一个产品对象,无须关心它的实现类。
优点:封装性,每个产品的实现类不是高层模块关心的,它关心接口和抽象类,只需要关心工厂类是谁,就能创建出一个需要的对象。
产品族的内部的约束为非公开状态。
缺点:产品族扩展困难,如果增加一个产品族,就需要在HumanFactory中增加方法,实现类同样要增加方法。
但是产品等级的扩展很简单,只需要为新的产品等级新增一个工厂类实现。