AspectJ实现设计模式(三)——工厂方法模式
来源:互联网 发布:手机上不能开淘宝店 编辑:程序博客网 时间:2024/05/10 06:45
本文将继续介绍使用AspectJ实现设计模式之工厂方法模式,文章以农场园丁管理水果(读过Java与模式的读者会很熟悉它)例子的形式描述了工厂方法模式AspectJ版本的参考实现。
工厂方法模式根据产品的等级结构使用对应的工厂来创建特定的产品,它一般包括抽象工厂、具体工厂和抽象产品、具体产品,每一个特定工厂用于创建一个对应的产品。模式的简易UML图例如下
抽象方面FactoryMethodProtocol很简单只定义了抽象pointcut createMethod用于捕捉特定应用的创建方法(也可以省略)。
FactoryMethodProtocol抽象方面
public abstract aspect FactoryMethodProtocol {
abstract pointcut createMethod();}
FactoryMethodImpl.java
public aspect FactoryMethodImpl extends FactroyMethodProtocol{
public Fruit FruitGardener.factory(){//为创建接口定义工厂方法
return null;
}
//Inter-type声明具体创建类并实现创建接口
declare parents : AppleGardener implements FruitGardener;
declare parents : GrapeGardener implements FruitGardener;
//指定createMethod捕捉FruitGardener及其子类的创建方法
pointcut createMethod() : call(Fruit FruitGardener+.factory());
Fruit around(FruitGardener gardener) : target(gardener) && createMethod(){
return chooseGardener(gardener);//工厂方法返回抽象产品。
}
private Fruit chooseGardener(FruitGardener gardener){
if(gardener instanceof AppleGardener){
return new Apple();
}
else if(gardener instanceof GrapeGardener){
return new Grape();
}
else{
throw new RuntimeException("No such kind of fruit");
}
}
//声明编译时错误:当客户直接使用new创建具体产品时发生。
//目的:强制程序完全按照工厂方法的形式创建产品。
//可选为声明警告 declare warning : [pointcut] : [warn msg]
declare error : !(within(FruitGardener+) && !createMethod())
&&!within(FactoryMethodImpl) && call(Fruit+.new(..))
: "You can only create fruits through the method factory provided by FruitGardener and its subclass";
}
三个空的创建对象声明,其创建逻辑在FactoryMethodImpl方面中定义
public interface FruitGardener {}
public class GrapeGardener {}
public class AppleGardener {}
Fruit.java抽象产品类
public abstract class Fruit {
public abstract void grow();
public abstract void harvest();
public abstract void plant();
}
Apple.java产品类
public class Apple extends Fruit{
public void grow(){
System.out.println("Apple is growing...");
}
public void harvest(){
System.out.println("Apple has been harvested");
}
public void plant(){
System.out.println("Apple has been planted");
}
}
Grape.java产品类
public class Grape extends Fruit{
public void grow(){
System.out.println("Grape is growing...");
}
public void harvest(){
System.out.println("Grape has been harvested");
}
public void plant(){
System.out.println("Grape has been planted");
}
}
Demo.java测试代码
public class Demo {
public static void main(String[] args) {
FruitGardener gardener=new AppleGardener();
Fruit fruit=gardener.factory();//创建Apple
fruit.grow();
fruit.harvest();
fruit.plant();
gardener=new GrapeGardener();
fruit=gardener.factory();//创建Grape
fruit.grow();
fruit.harvest();
fruit.plant();
//new Apple();new Grape();//产生编译错误,不能直接生成产品
}
}
测试代码使用苹果和葡萄园丁分别创建了苹果和葡萄,其运行结果如下
D:JavaDevjbuiderAOPFactoryMethodsrcaopfactorymethodDemo.java 26 You can only create fruits through the method factory provided by FruitGardener and its subclass 1 error.
至此,我已经使用AspectJ完全实现了一个使用工厂方法模式设计的农场园丁的例子。本系列之四将介绍如何用AspectJ实现抽象工厂模式。
参考资料
1.<<Java与模式>> 阎宏著 电子工业出版社
2.http://www.eclipse.org/AspectJ/
声明
本文由starchu1981保留版权,如果需要转贴请写明作者和出处。
- AspectJ实现设计模式(三)——工厂方法模式
- AspectJ实现设计模式(三)——工厂方法模式
- AspectJ实现设计模式(四)——抽象工厂模式
- 设计模式(三)——工厂方法模式
- 设计模式之三:工厂方法模式—多态工厂的实现
- AspectJ实现设计模式(一)——观察者模式
- AspectJ实现设计模式(二)——策略模式
- AspectJ实现设计模式(二)——策略模式
- AspectJ实现设计模式(五)—迭代子模式
- AspectJ实现设计模式(六)—单例模式
- AspectJ实现设计模式(七)—装饰模式
- AspectJ实现设计模式(六)—单例模式
- 设计模式(三) 工厂方法模式
- 设计模式(三)——工厂方法模式
- 常用设计模式(三)——工厂设计模式
- 设计模式——三工厂模式
- 设计模式C++实现——工厂方法模式
- 设计模式之—工厂方法模式(FactoryMethod)-Java实现
- 【C#】方法中默认参数的替换实现
- Jboss3.0-Tomcat4.03的虚拟主机的配置
- 旅店管理系统用例流程分析
- [转]输入子系统分析
- 浅析J2EE与.NET平台优劣
- AspectJ实现设计模式(三)——工厂方法模式
- Ant+junit的测试自动化
- JSP数据和JavaScirpt数据交互使用问题的一种解决方法
- 旅店管理系统开发目的及目标
- 用Java实现的eChat聊天服务器
- 延迟初始化错误(ERROR LazyInitializer)是如何产生的?
- 更好的提高你的工作效率——IDEA的快捷键介绍
- Json Object转Model, Model、DataTable转Json Object (Jayrock技巧)
- 一步一学Linux与Windows 共享文件Samba (v0.2b)