抽象工厂模式是所有形态的工厂模式中最为抽象和最具有一般性的一种形态。抽象工厂模式的简略类图如下图所示:
抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,创建多个产品族中的产品对象。这就是抽象工厂模式的用意.
抽象工厂模式与工厂方法模式的最大区别就在于,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式则需要面对多个产品等级结构。
采用抽象工厂模式设计出的系统类图如下图所示:
抽象工厂(AbstractFactory)角色:担任这个角色的是工厂方法模式的核心,它是与应用系统的商业逻辑无关的。通常使用Java接口或者抽象Java类实现,而所有的具体工厂类必须实现这个Java接口或继承这个抽象Java类。
具体工厂类(Concrete Factory)角色:这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的。通常使用具体Java类实现这个角色。
抽象产品(Abstract Product)角色:担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。
具体产品(Concrete Product)角色:抽象工厂模式创建的任何产品对象都是某一个具体产品类的实例。这是客户端最终需要的东西,其内部一定充满了应用系统的商业逻辑。
package com.javapatterns.abstractfactory;
public interface Creator
{
public ProductA factoryA();
public ProductB factoryB();
}
package com.javapatterns.abstractfactory;
public class ConcreteCreator1 implements Creator
{
public ProductA factoryA()
{
return new ProductA1();
}
public ProductB factoryB()
{
return new ProductB1();
}
}
package com.javapatterns.abstractfactory;
public class ConcreteCreator2 implements Creator
{
public ProductA factoryA()
{
return new ProductA2();
}
public ProductB factoryB()
{
return new ProductB2();
}
}
package com.javapatterns.abstractfactory;
public interface ProductA
{
}
package com.javapatterns.abstractfactory;
public class ProductA1 implements ProductA
{
public ProductA1()
{
System.out.println(this.getClass().toString());
}
}
package com.javapatterns.abstractfactory;
public class ProductA2 implements ProductA
{
public ProductA2()
{
System.out.println(this.getClass().toString());
}
}
package com.javapatterns.abstractfactory;
public interface ProductB
{
}
package com.javapatterns.abstractfactory;
public class ProductB1 implements ProductB
{
public ProductB1()
{
System.out.println(this.getClass().toString());
}
}
package com.javapatterns.abstractfactory;
public class ProductB2 implements ProductB
{
public ProductB2()
{
System.out.println(this.getClass().toString());
}
}
/**
*
*/
package com.javapatterns.abstractfactory;
import com.javapatterns.abstractfactory.*;
/**
* @author luhx
*
*/
public class abstractfactory_test {
public static Creator myCreator_s[];
public static void main(String[] args)
{
myCreator_s = new Creator[2];
myCreator_s[0] = new ConcreteCreator1();
myCreator_s[1] = new ConcreteCreator2();
for(int i = 0; i < myCreator_s.length; i++){
myCreator_s[i].factoryA();
myCreator_s[i].factoryB();
}
}
}