抽象工厂模式是对象的创建模式,它是工厂方法的进一步推广。它为客户提供一个接口,使得客户不必在意产品类型的情况下,创建多个产品族中的产品对象。模式的简易UML图例如下
现在将工厂的创建方法交由一个具体的抽象工厂方面来处理,从而具体的工厂类不需要知道需要实现哪个抽象工厂,也不必了解产品的创建逻辑。本文的例子系统的UML图如下所示
抽象工厂方面使用Inter-type声明为工厂类声明了需实现的抽象工厂接口并根据捕捉到的创建方法调用,实施具体的创建逻辑。
AbstractFactoryAspect.java
public aspect AbstractFactoryAspect{
public Cpu ComputerProducer.createCpu(){
return null;
}
public Ram ComputerProducer.createRam(){
return null;
}
declare parents : MacProducer implements ComputerProducer;
declare parents : PcProducer implements ComputerProducer;
//捕捉Cpu产品族的创建
Cpu around(ComputerProducer producer) : target(producer)
&& call(Cpu ComputerProducer+.createCpu()){
return chooseCpuProducer(producer);
}
//捕捉Ram产品族的创建
Ram around(ComputerProducer producer) : target(producer)
&& call(Ram ComputerProducer+.createRam()){
return chooseRamProducer(producer);
}
//选择不同的工厂类
private Cpu chooseCpuProducer(ComputerProducer
producer){
if(producer instanceof MacProducer){
return new MacCpu();
}
else if(producer instanceof PcProducer){
return new PcCpu();
}
else{
throw new RuntimeException("No such kind of producer");
}
}
private Ram chooseRamProducer(ComputerProducer
producer){
if(producer instanceof MacProducer){
return new MacRam();
}
else if(producer instanceof PcProducer){
return new PcRam();
}
else{
throw new RuntimeException("No such kind of producer");
}
}
}
抽象工厂和具体工厂都很简单
public interface ComputerProducer {}
public class PcProducer {}
public class MacProducer{}
这里出于简单易懂考虑没有实现任何方法。
同样产品族类的代码只作为说明,没有实现任何功能。
public interface Cpu {}
public interface Ram{}
public class PcCpu{}
public class MacCpu{}
public class PcRam{}
public class MacRam{}
测试代码Demo.java
public class Demo {
public static void main(String[] args) {
ComputerProducer producer=new PcProducer();
System.out.println((producer.createCpu()).toString());
System.out.println((producer.createRam()).toString());
producer=new MacProducer();
System.out.println((producer.createCpu()).toString());
System.out.println((producer.createRam()).toString());
}
}
输出的结果如下
aopabstractfactory.PcCpu
aopabstractfactory.PcRam
aopabstractfactory.MacCpu
aopabstractfactory.MacRam
至此,我已经使用AspectJ简单实现了一个使用抽象工厂模式设计的IT产品创建的例子。本系列之五将介绍如何用AspectJ实现迭代子模式。
|