AspectJ实现设计模式(三)——工厂方法模式

原创 2003年07月22日 08:01:00

    本文将继续介绍使用AspectJ实现设计模式之工厂方法模式,文章以农场园丁管理水果(读过Java与模式的读者会很熟悉它)例子的形式描述了工厂方法模式AspectJ版本的参考实现。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

    工厂方法模式根据产品的等级结构使用对应的工厂来创建特定的产品,它一般包括抽象工厂、具体工厂和抽象产品、具体产品,每一个特定工厂用于创建一个对应的产品。模式的简易UML图例如下

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />

下面是使用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();//产生编译错误,不能直接生成产品

}
}

测试代码使用苹果和葡萄园丁分别创建了苹果和葡萄,其运行结果如下

Apple is growing...

Apple has been harvested.

Apple has been planted.

Grape is growing..

Grape has been harvested.

grape has been planted.

有一点值得注意,如果在Demo中加入new Apple()或new Grape()等直接创建产品的语句,则ajc编译器会根据在FactoryMethodImpl方面中声明的错误而无法编译成功,并会得到如下输出:

D:/JavaDev/jbuider/AOPFactoryMethod/src/aopfactorymethod/Demo.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保留版权,如果需要转贴请写明作者和出处。

Java设计模式之工厂方法模式【Factory Method Pattern】

工厂方法模式(FACTORY METHOD)是一种常用的对象创建型设计模式,此模式的核心精神是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的...
  • Lixuanshengchao
  • Lixuanshengchao
  • 2016年05月04日 21:27
  • 969

软件设计模式——工厂方法模式(Factory Method)

工厂方法模式去掉了简单工厂模式中工厂方法的静态属性,使得它可以被子类继承。通俗的来说就是把简单工厂模式里面的分支语句给去掉,将每个具体产品的实例化过程放到相应的产品中去。相应的角色如下: (1)抽象...
  • Jungle_hello
  • Jungle_hello
  • 2016年04月13日 22:51
  • 908

Java设计模式之“工厂方法模式”

工厂方法模式 与简单工厂模式不同的是,简单工厂模式是工厂自己去实现对所有产品的构造的过程。根据不同的指令去生产对应的产品。但是,如果需求有变更,有新的产品需要去生产,或者有旧的产品不必去生产,都需要去...
  • DucklikeJAVA
  • DucklikeJAVA
  • 2016年03月25日 21:45
  • 530

23种设计模式----创建型模式(工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式)

1.单例模式  单例模式(Singleton Pattern):确保某一个类只有一个实例,而且自己实例化并向整个系统提供这个实例。   通用类图如下:      通用代码如下:public cl...
  • oChangWen
  • oChangWen
  • 2017年06月17日 21:37
  • 446

Java设计模式菜鸟系列(四)工厂方法模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39760895 工厂方法模式(Factory Method)分为三种: 一、普通工厂模式。...
  • JAVE_LOVER
  • JAVE_LOVER
  • 2014年10月04日 22:29
  • 2595

Java设计模式—工厂方法模式&抽象工厂模式

工厂方法模式与抽象工厂模式都是设计模式中重要而且常见的模式。 通用类图如下:         在工厂方法模式中,抽象产品类Product负责定义产品的共性,实现对事物最抽象的定义;C...
  • qq_25827845
  • qq_25827845
  • 2016年09月11日 15:07
  • 4726

工厂方法模式(Factory Method)-最易懂的设计模式解析

前言在上文提到的最易懂的设计模式系列解析:简单工厂模式,发现简单工厂模式存在一系列问题: 工厂类集中了所有实例(产品)的创建逻辑,一旦这个工厂不能正常工作,整个系统都会受到影响; 违背“开放 - 关闭...
  • carson_ho
  • carson_ho
  • 2016年08月28日 08:31
  • 3748

大话设计模式C++实现-第8章-工厂方法模式

一、UML图 二、包含的角色 (1)抽象工厂 (2)具体工厂 (3)抽象产品 (4)具体产品 三、优势 (1)工厂方法模式是对简单工厂模式的稍微的改进。工厂方法模式的用意是定义一个创建产品对象的工...
  • XD_lixin
  • XD_lixin
  • 2014年11月09日 22:26
  • 1841

设计模式的三大类别

创建型模式:(5) 抽象工厂、创建者、工厂方法、原型、单例 结构型模式:(7) 适配器、桥接、组合、装饰、外观、享元、代理 行为型模式:(10) 观察者、命令、状态、职责链 解释器、中介者、访...
  • Deaful
  • Deaful
  • 2014年03月05日 21:17
  • 3222

【设计模式】简单工厂模式与工厂方法模式详细解读

1.前言     设计模式,各具特色,今天在此总结一下常见模式中 简单工厂模式与工厂方法模式的区别与联系 2.两种模式概要    1. 简单工厂模式         对于简单工厂模式的介绍,请...
  • yudandan10
  • yudandan10
  • 2013年03月10日 15:09
  • 4758
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:AspectJ实现设计模式(三)——工厂方法模式
举报原因:
原因补充:

(最多只允许输入30个字)