抽象工厂(Abstract Factory)
抽象工厂模式与工厂方法模式的最大区别就在于,工厂方法模式针对的是一个产品等
级结构;而抽象工厂模式则需要面对多个产品等级结构。
“开-闭”原则要求一个软件系统可以在不修改原有代码的情况下,通过扩展达到增强
其功能的目的。对于一个涉及到多个产品等级结构和多个产品族的系统,其功能的增强不
外乎两个方面:
(1)增加新的产品族;
(2)增加新的产品等级结构。
那么抽象工厂模式是怎样支持这两方面功能增强的呢?
增加新的产品族
在产品等级结构的数目不变的情况下,增加新的产品族,就意味着在每一个产品等级
结构中增加一个(或者多个)新的具体(或者抽象和具体)产品角色。
由于工厂等级结构是与产品等级结构平行的登记机构,因此,当产品等级结构有所调
整时,需要将工厂等级结构做相应的调整。现在产品等级结构中出现了新的元素,因此,
需要向工厂等级结构中加入相应的新元素就可以了。
换言之,设计师只需要向系统中加入新的具体工厂类就可以了,没有必要修改已有的
工厂角色或者产品角色。因此,在系统中的产品族增加时,抽象工厂模式是支持“开-闭”原
则的。
增加新的产品等级结构
在产品族的数目不变的情况下,增加新的产品等级结构。换言之,所有的产品等级结
构中的产品数目不会改变,但是现在多出一个与现有的产品等级结构平行的新的产品等级
结构。
要做到这一点,就需要修改所有的工厂角色,给每一个工厂类都增加一个新的工厂方
法,而这显然是违背“开–闭”原则的。换言之,对于产品等级结构的增加,抽象工厂模式
是不支持“开–闭”原则的。
综合起来,抽象工厂模式以一种倾斜的方式支持增加新的产品,它为新产品族的增加
提供方便,而不能为新的产品等级结构的增加提供这样的方便。
package cn.sqsoft.javapatterns.abstractfactory;
/**
* @author 宝剑·123钢铁·123steel.cn
* 功能:抽象工厂
*/
public abstract class ComputerProducer
{
public abstract Cpu createCpu();
public abstract Ram createRam();
public static ComputerProducer getInstance(String which)
{
if (which.equalsIgnoreCase("Pc"))
{
return PcProducer.getInstance();
}
else if (which.equalsIgnoreCase("Mac"))
{
return MacProducer.getInstance();
}
return null;
}
}
package cn.sqsoft.javapatterns.abstractfactory;
/**
* @author 宝剑·123钢铁·123steel.cn
* 功能:具体工厂1
*/
public class MacProducer extends ComputerProducer
{
private static MacProducer producer = new MacProducer();
private MacProducer()
{
}
public Cpu createCpu()
{
return new MacCpu();
}
public Ram createRam()
{
return new MacRam();
}
public static MacProducer getInstance()
{
return producer;
}
/**
* @link dependency
* @label Creates
*/
/* # MacRam lnkMacRam; */
/**
* @link dependency
* @label Creates
*/
/* # MacCpu lnkMacCpu; */
}
package cn.sqsoft.javapatterns.abstractfactory;
/**
* @author 宝剑·123钢铁·123steel.cn
* 功能:具体工厂2
*/
public class PcProducer extends ComputerProducer
{
private static PcProducer producer = new PcProducer();
private PcProducer()
{
}
public Cpu createCpu()
{
return new PcCpu();
}
public Ram createRam()
{
return new PcRam();
}
public static PcProducer getInstance()
{
return producer;
}
/** @link dependency
* @label Creates*/
/*# PcCpu lnkPcCpu; */
/** @link dependency
* @label Creates*/
/*# PcRam lnkPcRam; */
}
package cn.sqsoft.javapatterns.abstractfactory;
/**
* @author 宝剑·123钢铁·123steel.cn
* 功能:抽象产品1
*/
public interface Cpu
{
}
package cn.sqsoft.javapatterns.abstractfactory;
/**
* @author Administrator
* 功能:抽象产品2
*/
public interface Ram
{
}
package cn.sqsoft.javapatterns.abstractfactory;
/**
* @author 宝剑·123钢铁·123steel.cn
* 功能:具体产品
*/
public class MacCpu implements Cpu
{
}
package cn.sqsoft.javapatterns.abstractfactory;
/**
* @author 宝剑·123钢铁·123steel.cn
* 功能:具体产品
*/
public class PcCpu implements Cpu
{
}
package cn.sqsoft.javapatterns.abstractfactory;
/**
* @author 宝剑·123钢铁·123steel.cn
* 功能:具体产品
*/
public class MacRam implements Ram
{
}
package cn.sqsoft.javapatterns.abstractfactory;
/**
* @author 宝剑·123钢铁·123steel.cn
* 功能:具体产品
*/
public class PcRam implements Ram
{
}