您的位置:首页 > 其它

设计模式:抽象工厂模式(Abstract Factory Pattern)

2015-09-26 16:26 591 查看
抽象工厂模式:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。

人种接口

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中增加方法,实现类同样要增加方法。

但是产品等级的扩展很简单,只需要为新的产品等级新增一个工厂类实现。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: